Picwin Asteroid Game

Picwin Asteroid Game

mIRC Snippet - Picwin asteroid game pentru cei care doresc sa invete limbajul de scripting pentru jocuri.

Postat de Copyright Categorie Review user Vizualizari Data
BLKoldSUN necunoscut activity Cod testat 542 2023-12-17 00:25:17

alias Asteroids {
  Asteroids.End
  if (!$window(@Asteroids)) { window -Bdpf +tns @Asteroids -1 -1 $iif($1,$1,320) $iif($2,$2,240) }
  hadd -m Asteroids FPS 1 $ticks
  hadd -m Asteroids GameUpdate $ticks
  hadd -m Asteroids DrawUpdate $ticks
  hadd -m Asteroids Player.1.data Ship 0 0 0 -1 0 0 0
  Asteroids.AddObject largerock
  Asteroids.GameLoop
}
alias -l Asteroids.End { hfree -w Asteroids | .timerAsteroids off }
alias -l Asteroids.Polygons {
  if ($1 = ship) { return 11 0 -11 -7 -7 -3 -7 3 -11 7 }
  if ($1 = flame) { return -7 -2 -12 0 -7 2 -7 -2 }
  if ($1 = largeRock1) { return -39 -25 -33 -8 -38 21 -23 25 -13 39 24 34 38 7 33 -15 38 -31 16 -39 -4 -34 -16 -39 }
  if ($1 = largeRock2) { return -32 35 -4 32 24 38 38 23 31 -4 38 -25 14 -39 -28 -31 -39 -16 -31 4 -38 22 }
  if ($1 = largeRock3) { return 12 -39 -2 -26 -28 -37 -38 -14 -21 9 -34 34 -6 38 35 23 21 -14 36 -25 }
  if ($1 = medRock1) { return -7 -19 -19 -15 -12 -5 -19 0 -19 13 -9 19 12 16 18 11 13 6 19 -1 16 -17 }
  if ($1 = medRock2) { return 9 -19 18 -8 7 0 15 15 -7 13 -16 17 -18 3 -13 -6 -16 -17 }
  if ($1 = medRock3) { return 2 18 18 10 8 0 18 -13 6 -18 -17 -14 -10 -3 -13 15 }
  if ($1 = smallRock1) { return -8 -8 -5 -1 -8 3 0 9 8 4 8 -5 1 -9 }     
  if ($1 = smallRock2) { return -6 8 1 4 8 7 10 -1 4 -10 -8 -6 -4 0 }
  if ($1 = smallRock3) { return -8 -9 -5 -2 -8 5 6 8 9 6 7 -3 9 -9 0 -7 }
}
alias -l Asteroids.TranslatePolygon {
  var %c = $4 , %s = $5 , %ns = %s * -1 , %ox = $2 + $6 , %oy = $3 + $7
  return $regsubex($Asteroids.Polygons($1),/([^ ]+) ([^ ]+)/g,$calc($Vector2D(\1,\2,%c,%ns).dot + %ox) $calc($Vector2D(\1,\2,%s,%c).dot + %oy))
}
alias -l Asteroids.AddObject {
  var %w = $window(@Asteroids).dw , %h = $window(@Asteroids).dh / 2 , %hw = %w / 2 , %hh = %h / 2 , %a = 1 , %type = $1
  if (rock isin $1) {
    while ($hget(Asteroids,$+(Asteroid.,%a,.data))) { inc %a }
    if ($1 = largerock) { var %mag = 0.008 , %type = $+($1,$r(1,3)) }
    if ($1 = medrock) { var %mag = 0.011 , %type = $+($1,$r(1,3)) }
    if ($1 = smallrock) { var %mag = 0.022 , %type = $+($1,$r(1,3)) }
    var %ang = $r(0,360) + 15 , %x = $r(0,%w) - %hw , %y = $r(0,%h) - %hh , %dx = $sin(%ang).deg , %dy = $cos(%ang).deg , %vx = %dx * %mag , %vy = %dy * %mag
    hadd -m Asteroids $+(Asteroid.,%a,.data) %type $iif($0 = 3,$2-3,%x %y) %dx %dy %vx %vy
  }
  elseif ($1 = bullet) {
    var %a = 1 , %type = 2000 , %tot = $hfind(Asteroids,Bullet.*.data,0,w)
    if (%tot < 6) {
      while ($hget(Asteroids,$+(Bullet.,%a,.data))) { inc %a }
      var %vx = $4 * 0.15 , %vy = $5 * 0.15
      hadd -m Asteroids $+(Bullet.,%a,.data) %type $2-5 $Vector2D(%vx,%vy,$6,$7).Add
    }
  }
}
alias -l Asteroids.GameLoop {
  if (!$window(@Asteroids)) { Asteroids.End | return }
  var %hw = $window(@Asteroids).dw / 2 , %hh = $window(@Asteroids).dh / 2 , %GU = $hget(Asteroids,GameUpdate) , %gt = $ticks - %GU
  hadd -m Asteroids GameUpdate $ticks
  Asteroids.CheckKeys %gt
  noop $hfind(Asteroids,Asteroid.*.data.Translated,0,w,Asteroids.TestCollision $1)
  noop $hfind(Asteroids,*.*.data,0,w,Asteroids.UpdatePosition $1 %gt %hw %hh)
  Asteroids.Render %hw %hh
  tokenize 32 $hget(Asteroids,FPS)
  var %fs = $1 + 1 , %ft = $ticks - $2 , %ft = %ft / 1000
  if (%ft < 0.5) { hadd -m Asteroids FPS %fs $2 }
  else {
    titlebar @Asteroids Avg. FPS: $round($calc(%fs / %ft),0)
    hadd -m Asteroids FPS 0 $ticks
  }
  .timerAsteroids -m 1 0 Asteroids.GameLoop
}
alias -l Asteroids.CheckKeys {
  var %dt = $1 , %at = $1 / 15 , %dead = $hget(Asteroids,Dead) , %fired = $hget(Asteroids,Fired)
  tokenize 32 $hget(Asteroids,Player.1.data)
  var %type = $1 , %x = $2 , %y = $3 , %dx = $4 , %dy = $5 , %vx = $6 , %vy = $7
  var %e = $hget(Asteroids,Key.13) , %l = $hget(Asteroids,Key.37) , %u = $hget(Asteroids,Key.38) , %r = $hget(Asteroids,Key.39) , %sp = $hget(Asteroids,Key.32)
  if (%l || %r) && (!%dead) { tokenize 32 $Vector2D(%dx,%dy,$calc($+($iif(%l,-),%dt) * 0.27)).Rot | var %dx = $1 , %dy = $2 }
  if (%u && !%dead) { 
    tokenize 32 $Vector2D($calc(%dx * %at * 0.002),$calc(%dy * %at * 0.002),%vx,%vy).Add 
    if ($Vector2D($1,$2).MagSq < 0.1) { var %vx = $1 , %vy = $2 }
    else { tokenize 32 $Vector2D($1,$2).norm | var %vx = $1 * 0.32 , %vy = $2 * 0.32 }
  }
  if (%sp && !%dead) && (!%fired || $calc($ticks - %fired) >= 250) {
    Asteroids.AddObject bullet %x %y %dx %dy %vx %vy 
    hadd -m Asteroids Fired $ticks
  }
  if (%e) && (!$hfind(Asteroids,Asteroid.*.data,0,w) || %dead) { Asteroids | return }
  hadd -m Asteroids Player.1.data %type %x %y %dx %dy %vx %vy
}
alias -l Asteroids.TestCollision {
  var %asteroid = $1 , %bcol = $hfind(Asteroids,Bullet.*.data.translated,0,w,Asteroids.CheckCollision %asteroid $1)
  if (!%bcol) { Asteroids.CheckCollision $1 }
}
alias -l Asteroids.CheckCollision {
  var %a = $1 , %b = $2 , %AsteroidPoly = $regsubex($hget(Asteroids,$1),/ /g,$chr(44)) , %BulletVec = $regsubex($hget(Asteroids,$2),/ /g,$chr(44))
  if (%AsteroidPoly && !$hget(Asteroids,Dead)) {
    var %PlayerPoly = $regsubex($hget(Asteroids,Player.1.data.Translated),/ /g,$chr(44)) , %AsteroidCount = $numtok(%AsteroidPoly,44) / 2 , %PlayerCount = $numtok(%PlayerPoly,44) / 2
    if ($onpoly(%AsteroidCount,%PlayerCount, [ %AsteroidPoly ] , [ %PlayerPoly ] )) { 
      hadd -m Asteroids Dead 1
      hadd -m Asteroids Player.1.data Ship 0 0 0 -1 0 0 0
    }
  }
  if (%BulletVec && %AsteroidPoly) {
    if ($inpoly( [ %BulletVec ] , [ %AsteroidPoly ] )) {
      var %a = $deltok($1,4,46) , %b = $deltok($2,4,46)
      tokenize 32 $hget(Asteroids,%a)
      if (large isin $1) { var %x = 0 | while (%x < 2) { inc %x | Asteroids.AddObject medrock $2-3 } }
      elseif (med isin $1) { var %x = 0 | while (%x < 4) { inc %x | Asteroids.AddObject smallrock $2-3 } }
      hdel -w Asteroids %a $+ *
      hdel -w Asteroids %b $+ *
    }
  }
}
alias -l Asteroids.UpdatePosition {
  var %key = $1 , %dt = $2 , %hw = $3 , %hh = $4
  tokenize 32 $hget(Asteroids,$1)
  var %type = $1 , %x = $2 , %y = $3 , %dx = $4 , %dy = $5 , %vx = $6, %vy = $7
  if (%type isnum) { dec %type %dt }
  var %l = $Vector2D(%x,%y,1,0).dot , %r = %l * -1 , %u = $Vector2D(%x,%y,0,1).dot , %d = %u * -1
  var %vl = $Vector2D(%vx,%vy,1,0).dot , %vr = %vl * -1 , %vu = $Vector2D(%vx,%vy,0,1).dot , %vd = %vu * -1
  var %xp1 = %l + %hw , %xp2 = %r + %hw , %yp1 = %u + %hh , %yp2 = %d + %hh
  if (%xp1 < 0 && %vl < 0) || (%xp2 < 0 && %vr < 0) { var %x = %x * -1 }
  if (%yp1 < 0 && %vu < 0) || (%yp2 < 0 && %vd < 0) { var %y = %y * -1 }
  if (rock isin %type) {
    if (large isin %type) { var %div = 30 }
    elseif (med isin %type) { var %div = 20 }
    else { var %div = 10 }
    var %avx = %vx * %dt , %avy = %vy * %dt
    tokenize 32 $Vector2D(0,1,$Vector2D(%avx,%avy,0,1).Dot).MultScalar
    tokenize 32 $Vector2D(%avx,%avy,$1,$2).Sub
    var %rot = $calc($Vector2D($1,$2,0,1).Wedge / %div * 57.29578)
    tokenize 32 $Vector2D(%dx,%dy,%rot).Rot | var %dx = $1 , %dy = $2 
  }
  tokenize 32 $Vector2D(%x,%y,$calc(%vx * %dt),$calc(%vy * %dt)).Add
  hadd -m Asteroids %key %type $1-2 %dx %dy %vx %vy
  if (%type isnum) { hadd -m Asteroids $+(%key,.Translated) $Vector2D(%x,%y,%hw,%hh).Add }
  else { 
    hadd -m Asteroids $+(%key,.Translated) $Asteroids.TranslatePolygon(%type,$1,$2,%dx,%dy,%hw,%hh) 
    if (%type = ship) {
      if ($hget(Asteroids,Key.38)) { hadd -m Asteroids Player.2.Data.Translated $Asteroids.TranslatePolygon(flame,$1,$2,%dx,%dy,%hw,%hh) }
      else { hdel -w Asteroids Player.2.* }
    }
  }
  if (%type <= 0) { hdel -w Asteroids %key $+ * }
}
alias -l Asteroids.DrawTranslated {
  if (Player !isin $1 || !$hget(Asteroids,Dead)) {
    tokenize 32 $hget(Asteroids,$1)
    if ($0 > 8) { drawline -n @Asteroids 0 1 $1- $1-2 }
    elseif ($0 > 3) { drawline -n @Asteroids 7 1 $1- $1-2 }
    elseif ($0) { drawdot -n @Asteroids 9 2 $1- }
  }
}
alias -l Asteroids.Render {
  drawrect -nf @Asteroids 1 1 0 0 $window(@Asteroids).dw $window(@Asteroids).dh
  noop $hfind(Asteroids,*.*.data.translated,0,w,Asteroids.DrawTranslated $1)
  if ($hget(Asteroids,Dead)) { var %msg = You LOSE! Press Enter... }
  elseif (!$hfind(Asteroids,Asteroid.*.data.translated,0,w)) { var %msg = You Win! Press Enter... }
  if (%msg) {  
    var %ox = $width(%msg,$window(@Asteroids).font,$window(@Asteroids).fontsize) / 2
    drawtext -n @Asteroids 0 $calc($1 - %ox) $2 %msg
  }
  drawdot @Asteroids
}
on *:keydown:@Asteroids:*: { hadd -m Asteroids $+(Key.,$keyval) 1 }
on *:keyup:@Asteroids:*: { hdel -w Asteroids $+(Key.,$keyval) | if ($keyval = 32) { hdel -w Asteroids Fired  } }