From 47a208677d5ddc31d8886af52621aba0ee640d61 Mon Sep 17 00:00:00 2001 From: Tatjam Date: Sun, 10 Jul 2022 02:48:48 +0200 Subject: [PATCH] More progress --- res/enemies/rockman_hurt.mp3 | Bin 0 -> 5579 bytes res/level1/back.png | Bin 0 -> 1116 bytes res/level1/map.png | Bin 2610 -> 2914 bytes res/level1/map.yaml | 11 ++ res/level1/map_ent.png | Bin 0 -> 1556 bytes res/level1/wood_back.png | Bin 0 -> 2713 bytes res/player/attack.mp3 | Bin 0 -> 12106 bytes res/player/hit.mp3 | Bin 0 -> 10224 bytes res/player/hit_connect.mp3 | Bin 0 -> 27607 bytes res/player/player.png | Bin 8336 -> 14446 bytes res/player/player.yaml | 38 ++++++- res/player/player_emit.png | Bin 1168 -> 1890 bytes src/engine/graphics/sprite.nim | 4 + src/engine/map/map_loader.nim | 107 +++++++++--------- src/game/entities/enemies/rockman.nim | 0 src/game/entities/enemy.nim | 36 +++++-- src/game/entities/objects/rocks.nim | 29 ----- src/game/entities/physical_object.nim | 32 +++++- src/game/entities/player.nim | 150 ++++++++++++++++++++------ src/game/scenes/level.nim | 14 +-- src/game/userdata.nim | 12 +-- 21 files changed, 299 insertions(+), 134 deletions(-) create mode 100644 res/enemies/rockman_hurt.mp3 create mode 100644 res/level1/back.png create mode 100644 res/level1/map_ent.png create mode 100644 res/level1/wood_back.png create mode 100644 res/player/attack.mp3 create mode 100644 res/player/hit.mp3 create mode 100644 res/player/hit_connect.mp3 delete mode 100644 src/game/entities/enemies/rockman.nim delete mode 100644 src/game/entities/objects/rocks.nim diff --git a/res/enemies/rockman_hurt.mp3 b/res/enemies/rockman_hurt.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4a9ac6ef623d8ccf7d9504b68a28cac7e002f163 GIT binary patch literal 5579 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 YK!3+`JdrK~fFGaOGRJ$t{}ZYBFI(F;*#H0l literal 0 HcmV?d00001 diff --git a/res/level1/back.png b/res/level1/back.png new file mode 100644 index 0000000000000000000000000000000000000000..03b901a8e95ecb68400c939d38e0374c48f1e63b GIT binary patch literal 1116 zcmV-i1f%EX>4Tx04R}tkv&MmKpe$iQ>8^J4h9i%$WWauh>AE$6^me@v=v%)FuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfbaGO3krMxx6k5c1aNLh~_a1le0HIN3n$4LokXvz#@`JL4txBDyYInj8>f#3u)Sq`}l`ke~MfRxhi1f zn8yY*$gUs!4}N!R6(=XWq(~g-esP?S5g@b+H0zG@ee5{R6Cn5uT)|5Tqat9cEGGtSBr65hASOnhB=$rCD|1Hq7>h;#z$LRx*rLLB4fP+I| zv_#o!KJN~9_V(|YR)0TFzjB$IfFl|J000SaNLh0L04^f{04^f|c%?sf00007bV*G` z2j&L~04y}g(eY3K000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0006< zNkl@t8XD>UzfZ->^$`_c ziB9)#_X2=C-ADwCp<-POWP2E|x1C4Y|2~4{rvQTJW|#>OQN*B~XED@w)Lb|OXN-z5 z?)&6v2vepFhyp03_dL%vN^#@!BK=uY zCd8m%>QkpS1ydrVL`b<_WRN~t_F$Xv2L9-TjRd#ww|!)CddCHu`;JhoxGgEtOAcI; zFqNLwA_^IFs|LOajts!S6=ZvVi_+3_V6+^tIVY}B$nzeJM!13X)_9AaqJqft{d+dO zd_F`0s)v=C5Dcm2h47W=GR$Mt4RI-gB=tPV5~`arsLb%bcEKE$w=r~-LDh*9fQjkz&s*F03~VR)&Vsz6-JjR2%VI8vBD zVik}@Yx#^(FT>rux@%Cs>By7`%L0h(d=gQ}8!i9KI#$e-Xmg?z>KoBt^xQj72oAmf zXyBOp)xa?J@?KN;?;BS zJi%T)_s$dS)pPGW!CpQ0&J*m_bMHJMUOo5D6XMl#?>zD7>$n}J3XBmLv>Fgm2m@uo iT4p%)4-4Yz^ZXkjk`n5ggf!~FTfcqfwfF7UR0EtJz|f#~l< z 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 TPZ#Il00000NkvXXu0mjfx3B}W literal 0 HcmV?d00001 diff --git a/res/player/attack.mp3 b/res/player/attack.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fde3a90c2671cccc7bc79772658e418af2979c13 GIT binary patch literal 12106 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 QXLcq-Jo^LT|3%~f2V=&_P5=M^ literal 0 HcmV?d00001 diff --git a/res/player/hit.mp3 b/res/player/hit.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c7a26da4a852b9576a9884cbb0352acebbd7ab39 GIT binary patch literal 10224 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 bFZjCgu1@opT4Tph#q4@P1Bphb4 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 Bg?s=2 diff --git a/res/player/player.yaml b/res/player/player.yaml index 0e612d3..1574626 100644 --- a/res/player/player.yaml +++ b/res/player/player.yaml @@ -39,4 +39,40 @@ animations: loop: true frames: - clip: [210, 76, 70, 76] - duration: 0.2 \ No newline at end of file + duration: 0.2 +- name: "attack" + loop: false + frames: + - clip: [140, 152, 70, 76] + duration: 0.1 + - clip: [210, 152, 70, 76] + duration: 0.1 + - clip: [280, 152, 70, 76] + duration: 0.1 + - clip: [280, 76, 70, 76] + duration: 0.2 + - clip: [280, 0, 70, 76] + duration: 0.3 +- name: "toss" + loop: false + frames: + - clip: [350, 0, 70, 76] + duration: 0.6 + - clip: [350, 76, 70, 76] + duration: 0.4 + - clip: [350, 152, 70, 76] + duration: 0.1 + - clip: [350, 76, 70, 76] + duration: 0.1 + - clip: [350, 152, 70, 76] + duration: 0.1 + - clip: [350, 76, 70, 76] + duration: 0.1 + - clip: [350, 152, 70, 76] + duration: 0.1 + - clip: [350, 76, 70, 76] + duration: 0.1 + - clip: [350, 152, 70, 76] + duration: 0.1 + - clip: [350, 76, 70, 76] + duration: 0.1 \ No newline at end of file diff --git a/res/player/player_emit.png b/res/player/player_emit.png index 9617de5b5cc696e532ff02315f879245811d661a..6c9a6067cf4126adfd1208a4940d6eb03adf3d06 100644 GIT binary patch delta 1307 zcmbQh`G`-kGr-TCmrII^fq{Y7)59f*fq`)eko|;%4M<*34tTp!aXljk7X!ccuY&F) zlW#Dp*R%S1x;TbZ+KY@A;ok-p=y7yURUY7beK%f>cqUYR+w%G5_-|x9zcoM_Y&As47TT0Qo9kQ98xh79O zCYlI%sHL9}bJ;$Rxsj#8f$7#i69?}_GaPn(*K2Z!@Jm^^s_jbo|95gXs=ZGo6)ps7 z6Om8x*siuhNZnxa=A*0uWzMTYjVBlP0!`lNa7+H&@}DWCFD)k+fB( zHUB}NwDSi$wREW)+m9Q+{*}0U`}yD!=T&=69gYIMy+D!ir9I;YiN~UIQrR2YSgu^1 zVxm0xB9m-=#{u0ljQ0+#y~`@(FhgOMu+QmjZNQ|;xnN@164gu(21^-Gbap#1bzJNd z@L=FjVStk-E$9BOw036rQ1o|duGo)6odeuEOD;UFNdeh#!72Ds4=7+67#G=XBV9v+R)a)D035r=E{zCHHCYP$iuLhJ19rQZ)nFx)$}w3$Jp ztBu9s)3PVq-Z5l&IP^?iDXPW9$sy>{#M!vz(}KbR3HeJb6BC>i*4kvq$UN=sf55Z* zy^MI=t?Kg~hcfT)N%=Ipz5e;q=N-5E=KcJ>;D^Jmt)I8o0d>W#h_7gHm{mKcAm-ym zr`1mV{SS1qecVx3C)BjJw6#2F@#^Qlzx3YmtNRu{ zn)amJ!%!^iaq+Pzg~o)UrEDxh0-7^C?)N?Wf2X?euGy!97hg%I*DR>;`=ptzIw5UY z`tKjHE{>0tEfQ<3cYQBq(!7vz?Uzc}gC7wQ3`fmXSkxWvO_tJ|%b3DsY}eqxwfmHq z&&K2K1x)K7u+=i?8%0j(O~3Z_@V47EQ-B#l>vH@}H)ke~dz1bxmennuCd(itY<@25oD!MVD8!w|Cm?Ndn@xB)aE*s^vWR z!_4B`pS7I*Qy3T)q_@|{A9!qc_Vnw^KdU}YT@Zi8^+VnTjrAsdiI?d8U%U#_t% z`fZ$(8JVpn3owhIJ<;p+R?RD6>urXWW^Te=pE6%%@T*X-OnRnk^!Myvkz@`qT39{=2UR7+*zRukg z&cO(BBh!WW57X|&Juy>p_;9W8G|*R^hm^P)o4#MxQE-z9QA`nR)v&%7_g1Z?D#m4@ zn!oz$Kb7Bvoc^UsG_eBB`n;JtMqrN<2h`EpK!<~{ig?3~dH1iqtDnes<0CNA7(8A5 KT-G@yGywq6`p_W& diff --git a/src/engine/graphics/sprite.nim b/src/engine/graphics/sprite.nim index 1a9e833..c88f27b 100644 --- a/src/engine/graphics/sprite.nim +++ b/src/engine/graphics/sprite.nim @@ -206,6 +206,10 @@ proc rotation*(sprite: AnimatedSprite): float = return sprite.sprite.rotation proc animate*(sprite: var AnimatedSprite, dt: float) = + if sprite.animations.has_key(sprite.cur_anim): + var anim = sprite.animations[sprite.cur_anim] + if anim.frame < anim.frames.len: + sprite.sprite.clip = anim.frames[anim.frame].frame if sprite.paused: return diff --git a/src/engine/map/map_loader.nim b/src/engine/map/map_loader.nim index 63d2bc5..66f9f62 100644 --- a/src/engine/map/map_loader.nim +++ b/src/engine/map/map_loader.nim @@ -250,12 +250,12 @@ proc bilinear_interp(tl: Vec3i, tr: Vec3i, bl: Vec3i, br: Vec3i, h: float, v: fl return vec3i(sum.x.int32, sum.y.int32, sum.z.int32) proc marching_squares(tile: Image, scale: int, tile_info: Table[Vec3i, TileData], space: Space, - segments: var seq[SegmentShape]): Tile = + segments: var seq[SegmentShape], collide: bool): Tile = let bounds = get_bounds(tile) echo "Processing tile of size: " & $(bounds.z - bounds.x + 1) & "x" & $(bounds.w - bounds.y + 1) let pos = vec2i(bounds.x * scale.int32, bounds.y * scale.int32) echo bounds - var image = create_image((bounds.z - bounds.x + 2) * scale, (bounds.w - bounds.y + 2) * scale) + var image = create_image((bounds.z - bounds.x + 2) * scale, (bounds.w - bounds.y + 2) * scale, true) var body = newBody(1.0, 1.0) # We travel the corners of the pixels in the map texture @@ -279,57 +279,58 @@ proc marching_squares(tile: Image, scale: int, tile_info: Table[Vec3i, TileData] continue # Generate the segment(s) - if ms_case != 15: - var v0: Vect - var v1: Vect - var has_two: bool - var v2: Vect - var v3: Vect - case ms_case: - of 1, 14: - v0 = v(tx - 0.5, ty + 0.5) - v1 = v(tx, ty + 1.0) - of 2, 13: - v0 = v(tx + 0.5, ty + 0.5) - v1 = v(tx, ty + 1.0) - of 3, 12: - v0 = v(tx - 0.5, ty) - v1 = v(tx + 0.5, ty) - of 4, 11: - v0 = v(tx + 0.5, ty) - v1 = v(tx, ty - 0.5) - of 5: - v0 = v(tx - 0.5, ty) - v1 = v(tx, ty - 0.5) - has_two = true - v2 = v(tx + 0.5, ty + 0.5) - v1 = v(tx, ty + 1.0) - of 6, 9: - v0 = v(tx, ty - 0.5) - v1 = v(tx, ty + 0.5) - of 7, 8: - v0 = v(tx - 0.5, ty) - v1 = v(tx, ty - 0.5) - of 10: - v0 = v(tx - 0.5, ty + 0.5) - v1 = v(tx, ty + 1.0) - has_two = true - v2 = v(tx + 0.5, ty) - v3 = v(tx, ty - 0.5) - else: - discard - - v0 = v(v0.x * scale.toFloat, v0.y * scale.toFloat) - v1 = v(v1.x * scale.toFloat, v1.y * scale.toFloat) - v2 = v(v2.x * scale.toFloat, v2.y * scale.toFloat) - v3 = v(v3.x * scale.toFloat, v3.y * scale.toFloat) - var segment = newSegmentShape(space.staticBody, v0, v1, 1) - segments.add(segment) - discard space.addShape(segments[^1]) - if has_two: - let segment2 = newSegmentShape(space.staticBody, v2, v3, 1) + if collide: + if ms_case != 15: + var v0: Vect + var v1: Vect + var has_two: bool = false + var v2: Vect + var v3: Vect + case ms_case: + of 1, 14: + v0 = v(tx - 0.5, ty + 0.5) + v1 = v(tx, ty + 1.0) + of 2, 13: + v0 = v(tx + 0.5, ty + 0.5) + v1 = v(tx, ty + 1.0) + of 3, 12: + v0 = v(tx - 0.5, ty) + v1 = v(tx + 0.5, ty) + of 4, 11: + v0 = v(tx + 0.5, ty) + v1 = v(tx, ty - 0.5) + of 5: + v0 = v(tx - 0.5, ty) + v1 = v(tx, ty - 0.5) + has_two = true + v2 = v(tx + 0.5, ty + 0.5) + v3 = v(tx, ty + 1.0) + of 6, 9: + v0 = v(tx, ty - 0.5) + v1 = v(tx, ty + 0.5) + of 7, 8: + v0 = v(tx - 0.5, ty) + v1 = v(tx, ty - 0.5) + of 10: + v0 = v(tx - 0.5, ty + 0.5) + v1 = v(tx, ty + 1.0) + has_two = true + v2 = v(tx + 0.5, ty) + v3 = v(tx, ty - 0.5) + else: + discard + + v0 = v(v0.x * scale.toFloat, v0.y * scale.toFloat) + v1 = v(v1.x * scale.toFloat, v1.y * scale.toFloat) + v2 = v(v2.x * scale.toFloat, v2.y * scale.toFloat) + v3 = v(v3.x * scale.toFloat, v3.y * scale.toFloat) + var segment = newSegmentShape(space.staticBody, v0, v1, 1) segments.add(segment) discard space.addShape(segments[^1]) + if has_two: + var segment2 = newSegmentShape(space.staticBody, v2, v3, 1) + segments.add(segment2) + discard space.addShape(segments[^1]) var tldata, trdata, bldata, brdata: Option[TileData] @@ -488,6 +489,7 @@ proc extract_separated_tiles(imageo: Image): seq[Image] = return tiles +# classes of name B@wathever will not have collision (they are useful as backgrounds) proc load_map*(map: string, scale: int, space: Space): Map = let map_info = load_map_info(map) # Load images @@ -524,7 +526,8 @@ proc load_map*(map: string, scale: int, space: Space): Map = for class, images in ground_tiles_img: var tiles: seq[Tile] for image in images: - tiles.add(marching_squares(image, scale, tile_textures, space, segments)) + tiles.add(marching_squares(image, scale, tile_textures, space, segments, + not(class[0] == 'B' and class[1] == '@'))) ground_tiles[class] = tiles diff --git a/src/game/entities/enemies/rockman.nim b/src/game/entities/enemies/rockman.nim deleted file mode 100644 index e69de29..0000000 diff --git a/src/game/entities/enemy.nim b/src/game/entities/enemy.nim index 1d14c0d..c780ee2 100644 --- a/src/game/entities/enemy.nim +++ b/src/game/entities/enemy.nim @@ -1,7 +1,7 @@ include ../../engine/base -import enemies/rockman import player +import physical_object import random import ../userdata @@ -17,12 +17,15 @@ type retreat_goal: float retreat: bool + dead*: bool + health: float + hurt_wav: WavHandle sprite*: AnimatedSprite phys_body: Body phys_shape: Shape - user_data: UserData + user_data*: UserData -proc create_rockman*(pos: Vec2f, space: Space): Enemy = +proc create_rockman*(pos: Vec2f, space: Space, id: int): Enemy = result = new(Enemy) result.sprite = create_animated_sprite("res/enemies/rockman.yaml") let mass = 50.0 @@ -30,18 +33,30 @@ proc create_rockman*(pos: Vec2f, space: Space): Enemy = result.phys_body = space.addBody(newBody(mass, moment)) result.phys_shape = space.addShape(newBoxShape(result.phys_body, 31.0, 31.0, 0.0)) - result.user_data = make_enemy_userdata(addr result) - result.phys_shape.userData = addr result.user_data result.phys_shape.friction = 0.8 result.phys_body.position = v(pos.x, pos.y) + result.hurt_wav = load_sound("res/enemies/rockman_hurt.mp3") + result.user_data = make_enemy_userdata(id) + result.phys_shape.userData = addr result.user_data result.kind = ekRockman + result.health = 2.0 + + +proc die(this: var Enemy, objects: var seq[PhysicalObject], space: Space) = + space.removeShape(this.phys_shape) + space.removeBody(this.phys_body) + this.dead = true + discard -proc update*(this: var Enemy, player: Player) = +proc update*(this: var Enemy, player: Player, objects: var seq[PhysicalObject], space: Space) = this.sprite.center_position = vec2f(this.phys_body.position.x, this.phys_body.position.y) this.sprite.animate(dt) + if this.health <= 0.0: + this.die(objects, space) + if this.kind == ekRockman: # Simple moving towards player behaviour, with random retreats if this.retreat: @@ -59,10 +74,17 @@ proc update*(this: var Enemy, player: Player) = player_dir /= player_dist if player_dist < 300.0: if this.retreat: - this.phys_body.velocity = v(player_dir.x * 80.0, this.phys_body.velocity.y) + this.phys_body.velocity = v(player_dir.x * 70.0, this.phys_body.velocity.y) else: this.phys_body.velocity = v(-player_dir.x * 60.0, this.phys_body.velocity.y) +proc hurt*(this: var Enemy, point: Vect) = + this.health -= 1.0 + let p = this.phys_body.position + this.phys_body.applyImpulseAtWorldPoint(v(0, -5000.0), p) + discard this.hurt_wav.play_sound() + proc draw*(this: var Enemy) = renderer.draw(this.sprite) + diff --git a/src/game/entities/objects/rocks.nim b/src/game/entities/objects/rocks.nim deleted file mode 100644 index 52bc48e..0000000 --- a/src/game/entities/objects/rocks.nim +++ /dev/null @@ -1,29 +0,0 @@ -proc create_rock*(pos: Vec2f, space: Space): PhysicalObject = - result = new(PhysicalObject) - result.sprite = create_animated_sprite("res/objects/rock.yaml") - let mass = 50.0 - let moment = momentForCircle(mass, 0.0, 58.0, vzero) - - result.phys_body = space.addBody(newBody(mass, moment)) - result.phys_shape = space.addShape(newCircleShape(result.phys_body, 58.0, vzero)) - result.user_data = make_enemy_userdata(addr result) - result.phys_shape.userData = addr result.user_data - result.phys_body.position = v(pos.x, pos.y) - result.phys_shape.friction = 0.1 - - result.kind = okRock - -proc create_magmarock*(pos: Vec2f, space: Space): PhysicalObject = - result = new(PhysicalObject) - result.sprite = create_animated_sprite("res/objects/magmarock.yaml") - let mass = 60.0 - let moment = momentForCircle(mass, 0.0, 58.0, vzero) - - result.phys_body = space.addBody(newBody(mass, moment)) - result.phys_shape = space.addShape(newCircleShape(result.phys_body, 58.0, vzero)) - result.user_data = make_enemy_userdata(addr result) - result.phys_shape.userData = addr result.user_data - result.phys_body.position = v(pos.x, pos.y) - result.phys_shape.friction = 0.1 - - result.kind = okMagmaRock diff --git a/src/game/entities/physical_object.nim b/src/game/entities/physical_object.nim index 074e520..8147e26 100644 --- a/src/game/entities/physical_object.nim +++ b/src/game/entities/physical_object.nim @@ -17,14 +17,40 @@ type phys_shape: Shape user_data: UserData -include objects/rocks - proc update*(this: var PhysicalObject) = this.sprite.center_position = vec2f(this.phys_body.position.x, this.phys_body.position.y) this.sprite.rotation = this.phys_body.angle - echo this.phys_body.angle this.sprite.animate(dt) proc draw*(this: var PhysicalObject) = renderer.draw(this.sprite) +proc create_rock*(pos: Vec2f, space: Space, id: int): PhysicalObject = + result = new(PhysicalObject) + result.sprite = create_animated_sprite("res/objects/rock.yaml") + let mass = 50.0 + let moment = momentForCircle(mass, 0.0, 58.0, vzero) + + result.phys_body = space.addBody(newBody(mass, moment)) + result.phys_shape = space.addShape(newCircleShape(result.phys_body, 58.0, vzero)) + result.user_data = make_enemy_userdata(id) + result.phys_shape.userData = addr result.user_data + result.phys_body.position = v(pos.x, pos.y) + result.phys_shape.friction = 0.1 + + result.kind = okRock + +proc create_magmarock*(pos: Vec2f, space: Space, id: int): PhysicalObject = + result = new(PhysicalObject) + result.sprite = create_animated_sprite("res/objects/magmarock.yaml") + let mass = 60.0 + let moment = momentForCircle(mass, 0.0, 58.0, vzero) + + result.phys_body = space.addBody(newBody(mass, moment)) + result.phys_shape = space.addShape(newCircleShape(result.phys_body, 58.0, vzero)) + result.user_data = make_enemy_userdata(id) + result.phys_shape.userData = addr result.user_data + result.phys_body.position = v(pos.x, pos.y) + result.phys_shape.friction = 0.1 + + result.kind = okMagmaRock \ No newline at end of file diff --git a/src/game/entities/player.nim b/src/game/entities/player.nim index 8071a8d..bbfe53e 100644 --- a/src/game/entities/player.nim +++ b/src/game/entities/player.nim @@ -2,6 +2,7 @@ include ../../engine/base import nimgl/glfw import ../userdata + type Player* = ref object sprite*: AnimatedSprite lantern*: Sprite @@ -15,15 +16,27 @@ type Player* = ref object sliding: bool time_in_air: float our_data: UserData + attack_timer: float + played_attack: bool + in_attack: bool + in_toss: bool + release_toss: bool step_wav: WavHandle fall_wav: WavHandle jump_wav: WavHandle land_wav: WavHandle + miss_wav: WavHandle + hit_wav: WavHandle + attack_wav: WavHandle step_sound: AudioHandle fall_sound: AudioHandle +# This must be here to avoid circular dependency hell +import enemy +import physical_object + proc create_player*(pos: Vec2f, space: Space): Player = result = new(Player) @@ -35,7 +48,7 @@ proc create_player*(pos: Vec2f, space: Space): Player = result.phys_body = space.addBody(newBody(mass, moment)) result.phys_shape = space.addShape(newCircleShape(result.phys_body, 25.0, vzero)) - result.our_data = make_player_userdata(unsafeAddr result) + result.our_data = make_player_userdata() result.phys_shape.userData = unsafeAddr result.our_data result.phys_shape.friction = 0.0 result.phys_body.position = v(pos.x, pos.y) @@ -45,6 +58,9 @@ proc create_player*(pos: Vec2f, space: Space): Player = result.jump_wav = load_sound("res/player/jump.mp3") result.fall_wav = load_sound("res/player/fall.mp3") result.land_wav = load_sound("res/player/land.mp3") + result.hit_wav = load_sound("res/player/hit_connect.mp3") + result.attack_wav = load_sound("res/player/attack.mp3") + result.miss_wav = load_sound("res/player/hit.mp3") result.step_sound = create_sound(result.step_wav, true) result.fall_sound = create_sound(result.fall_wav, true) @@ -61,7 +77,43 @@ proc ground_query_foot(sh: Shape, p: Vect, n: Vect, a: Float, data: pointer) {.c # We can stand on anything cast[ptr bool](data)[] = true -proc update*(this: var Player) = +type ToHitData = object + hit: bool + enemies: seq[Enemy] + +# Sends hit to enemies +proc query_hit(sh: Shape, p: Vect, n: Vect, a: Float, data: pointer) {.cdecl.} = + # There's this weird 38 user data that we must ignore + if cast[int](sh.userData) > 100000: + let udata = cast[ptr UserData](sh.userData)[] + if udata.kind == bkEnemy: + let enemy_idx = udata.point + var datac = cast[ptr ToHitData](data) + datac[].hit = true + hurt(datac[].enemies[enemy_idx], p) + + +proc hit(this: Player, enemies: seq[Enemy]): bool = + let rays = this.phys_body.position + v(0.0, 0.0) + var raye = this.phys_body.position + v(34.0, 23.0) + if this.sprite.scale.x < 0.0: + raye = this.phys_body.position + v(-34.0, 23.0) + + let filter = chipmunk.ShapeFilter( + group:nil, + categories: 0b1111, + mask: 0b1111 + ) + var query_data: ToHitData + query_data.enemies = enemies + segmentQuery(this.phys_space, rays, raye, Float(4.0), filter, query_hit, addr query_data) + + return query_data.hit + +proc toss(this: Player, enemies: seq[Enemy], objects: seq[PhysicalObject]) = + discard + +proc update*(this: var Player, enemies: seq[Enemy], objects: seq[PhysicalObject]) = # Ground check let rfootp = this.phys_body.position + v(34.0, 25.0) let lfootp = this.phys_body.position + v(-34.0, 25.0) @@ -98,37 +150,73 @@ proc update*(this: var Player) = this.time_in_air += dt # Movement - var lateral = false - if glfw_window.getKey(GLFWKey.A) == GLFW_PRESS: - this.phys_body.position = this.phys_body.position + v(-dt * 100.0, 0.0) - this.sprite.scale = vec2f(-1.0, 1.0) - lateral = true - if glfw_window.getKey(GLFWKey.D) == GLFW_PRESS: - this.phys_body.position = this.phys_body.position + v(dt * 100.0, 0.0) - this.sprite.scale = vec2f(1.0, 1.0) - lateral = true - if glfw_window.getKey(GLFWKey.Space) == GLFW_PRESS: - if not this.last_jump and this.grounded: - this.phys_body.applyImpulseAtWorldPoint(v(0, -15000.0), v(0, 0)) - discard this.jump_wav.play_sound() - this.last_jump = true - else: - this.last_jump = false - - if this.time_in_air > 0.5: - this.sprite.start_anim("fall") + if this.in_attack: + this.attack_timer += dt + this.sprite.start_anim("attack") this.step_sound.pause() - this.fall_sound.resume() - this.fall_sound.set_volume(this.time_in_air - 0.5) + if this.attack_timer > 0.3 and not this.played_attack: + let connect = this.hit(enemies) + if connect: + discard this.hit_wav.play_sound() + else: + discard this.miss_wav.play_sound() + this.played_attack = true + if this.attack_timer > 0.8: + this.in_attack = false + elif this.in_toss: + if glfw_window.getKey(GLFWKey.C) != GLFW_PRESS or this.attack_timer > 1.8: + this.in_toss = false + this.toss(enemies, objects) + this.attack_timer += dt + this.sprite.start_anim("toss") + this.step_sound.pause() + else: - this.fall_sound.pause() - if lateral: - this.sprite.start_anim("walk") - this.step_sound.resume() - - if not lateral: - this.sprite.start_anim("idle") + var lateral = false + if glfw_window.getKey(GLFWKey.A) == GLFW_PRESS: + this.phys_body.position = this.phys_body.position + v(-dt * 100.0, 0.0) + this.sprite.scale = vec2f(-1.0, 1.0) + lateral = true + if glfw_window.getKey(GLFWKey.D) == GLFW_PRESS: + this.phys_body.position = this.phys_body.position + v(dt * 100.0, 0.0) + this.sprite.scale = vec2f(1.0, 1.0) + lateral = true + if glfw_window.getKey(GLFWKey.V) == GLFW_PRESS: + this.attack_timer = 0.0 + this.in_attack = true + this.played_attack = false + discard this.attack_wav.play_sound() + if glfw_window.getKey(GLFWKey.C) == GLFW_PRESS: + if this.release_toss: + this.attack_timer = 0.0 + this.in_toss = true + this.played_attack = false + this.release_toss = false + discard this.attack_wav.play_sound() + else: + this.release_toss = true + if glfw_window.getKey(GLFWKey.Space) == GLFW_PRESS: + if not this.last_jump and this.grounded: + this.phys_body.applyImpulseAtWorldPoint(v(0, -15000.0), v(0, 0)) + discard this.jump_wav.play_sound() + this.last_jump = true + else: + this.last_jump = false + + if this.time_in_air > 0.5: + this.sprite.start_anim("fall") this.step_sound.pause() + this.fall_sound.resume() + this.fall_sound.set_volume(this.time_in_air - 0.5) + else: + this.fall_sound.pause() + if lateral: + this.sprite.start_anim("walk") + this.step_sound.resume() + + if not lateral: + this.sprite.start_anim("idle") + this.step_sound.pause() if not this.sliding: this.phys_body.velocity = v(0, this.phys_body.velocity.y) @@ -140,6 +228,8 @@ proc update*(this: var Player) = this.sprite.animate(dt) + + proc draw*(this: var Player) = renderer.draw(this.sprite) renderer.draw(this.lantern) diff --git a/src/game/scenes/level.nim b/src/game/scenes/level.nim index 5bd4c75..0f37db4 100644 --- a/src/game/scenes/level.nim +++ b/src/game/scenes/level.nim @@ -43,23 +43,24 @@ proc init*(this: var Level, map: string, scale: int) = # Create all types of stuff if this.map.points.hasKey("rockman"): for point in this.map.points["rockman"]: - this.enemies.add(create_rockman(point, this.physics_space)) + this.enemies.add(create_rockman(point, this.physics_space, this.enemies.len)) if this.map.points.hasKey("rock"): for point in this.map.points["rock"]: - this.physical_objects.add(create_rock(point, this.physics_space)) + this.physical_objects.add(create_rock(point, this.physics_space, this.physical_objects.len)) if this.map.points.hasKey("magmarock"): for point in this.map.points["magmarock"]: - this.physical_objects.add(create_magmarock(point, this.physics_space)) + this.physical_objects.add(create_magmarock(point, this.physics_space, this.physical_objects.len)) proc update*(this: var Level) = this.physics_space.step(dt) for enemy in mitems(this.enemies): - enemy.update(this.player) + if not enemy.dead: + enemy.update(this.player, this.physical_objects, this.physics_space) for phys_obj in mitems(this.physical_objects): phys_obj.update() - this.player.update() + this.player.update(this.enemies, this.physical_objects) renderer.camera.center = this.player.sprite.position renderer.camera.scale = 1.0 @@ -67,7 +68,8 @@ proc update*(this: var Level) = proc draw*(this: var Level) = this.map.drawer.draw_tiles() for enemy in mitems(this.enemies): - enemy.draw() + if not enemy.dead: + enemy.draw() for phys_obj in mitems(this.physical_objects): phys_obj.draw() this.player.draw() diff --git a/src/game/userdata.nim b/src/game/userdata.nim index f6b1e5d..27aac93 100644 --- a/src/game/userdata.nim +++ b/src/game/userdata.nim @@ -7,24 +7,24 @@ type UserData* = ref object kind*: BodyKind - point*: pointer + point*: int proc make_terrain_userdata*(): UserData = result = new(UserData) result.kind = bkPlayer - result.point = nil + result.point = 0 -proc make_player_userdata*(player: pointer): UserData = +proc make_player_userdata*(): UserData = result = new(UserData) result.kind = bkPlayer - result.point = player + result.point = 0 -proc make_enemy_userdata*(enemy: pointer): UserData = +proc make_enemy_userdata*(enemy: int): UserData = result = new(UserData) result.kind = bkEnemy result.point = enemy -proc make_object_userdata*(obj: pointer): UserData = +proc make_object_userdata*(obj: int): UserData = result = new(UserData) result.kind = bkObject result.point = obj \ No newline at end of file