# player animation sprite: path: sam.gif size: [16, 32] # Geometria de col·lisió del jugador (independent de l'animació): # size → costat del quadrat de col·lisió (16×16) # base_size → costat del quadrat visual inferior del sprite (els "peus"); # s'usa per centrar la caixa de col·lisió sobre ell. collision: size: 16 base_size: 16 # Caixa de contacte actor-actor (jugador↔jugador, jugador↔momia/trampa). # Més petita que `size` perquè els contactes d'acció siguin precisos; # `size` es reserva per a la col·lisió amb murs/sarcòfags i per enfilar # els passadissos. Centrada en el mateix punt que la caixa base. hit_size: 8 # Alçada del cos en píxels. Funció DOBLE segons amb què col·lisione: # · Contra entitats (mummy, rolling_rock, sarc): si `jump_z > height` # d'aquella entitat, no hi ha col·lisió. Igual que als YAMLs # d'entitats. # · Contra altres jugadors: la col·lisió és binària per estat aeri. # Si un està en l'aire i l'altre no → cap col·lisió. Si tots dos # estan en l'aire, llavors `body_height` decideix si els rangs # verticals solapen i s'aplica el rebot mid-aire. `0` = sense cos # (ni rebot quan tots dos volen). height: 12 # Animacions en mapa (clau = nom). Camps per animació: # frames → llista d'índexs dins de l'spritesheet. # frame_ms → durada de cada frame en ms. Escalar = uniforme; llista = # per-frame (mateixa mida que `frames`). # loop → true per defecte. `loop: false` = un sol tret (es queda al # darrer frame i `animationIsCompleted()` passa a true). # loop_from → rebota a aquest índex en passar del final (implica loop). animations: stand_down: { frames: [1] } stand_up: { frames: [5] } stand: { frames: [9] } jump_down: { frames: [12] } jump_up: { frames: [13] } jump: { frames: [14] } stun_down: { frames: [16] } stun_up: { frames: [17] } stun: { frames: [18] } walk_down: frames: [0, 1, 2, 3] frame_ms: 100 walk_up: frames: [4, 5, 6, 7] frame_ms: 100 walk: frames: [8, 9, 10, 11] frame_ms: 100 hurt_down: frames: [0, 1, 2, 3] frame_ms: 100 hurt_up: frames: [4, 5, 6, 7] frame_ms: 100 hurt: frames: [8, 9, 10, 11] frame_ms: 100 # Inèrcia només de frenada. L'acceleració és sempre instantània (soltar # el teclat + prémer una direcció = velocitat plena); en canvi, quan es # solta la direcció el jugador decau linealment a 0 en `brake_time_ms`. # El `threshold_ms` filtra els tocs curts: si el temps acumulat de # moviment continu no ha arribat al llindar, la parada és instantània # (permet "passets" d'un tile sense rellisquera). L'acumulador es # reseteja només quan no hi ha ni input ni velocitat residual, així # els canvis de direcció enmig del coast no rearmen el llindar. # `brake_time_ms: 0` o absència del bloc = inèrcia desactivada. inertia: brake_time_ms: 150 threshold_ms: 300 # Gir de 180°: mentre dura, el facing queda fixat a la direcció # intermèdia (efecte purament visual; el moviment continua sense # alterar-se). Els girs de 90° no passen per cap intermedi. turn: duration_ms: 80 # Direcció intermèdia per a cada gir de 180° (sentit horari). transitions: west_to_east: down # passa per baix (stand_down) east_to_west: up # passa per dalt (stand_up) north_to_south: east # passa per la dreta (stand, sense flip) south_to_north: west # passa per l'esquerra (stand, amb flip) # Salt vertical (px verticals "visuals", no afecta la posició al món). # impulse → velocitat vertical inicial (px/s) en deixar el sòl. # gravity → acceleració descendent constant (px/s²). # landing_stun_ms → temps en què el jugador queda paralitzat en aterrar # (no es pot moure ni tornar a saltar). # shadow_y_offset → desplaçament vertical de la sombra (px, positiu = # puja). Compensa la franja transparent que els # sprites del jugador tenen sota els peus reals # perquè camine "pel mig del passadís" (3 px aquí). # sound → fitxer .wav reproduït al despegue (relatiu a # data/sounds/). Buit o absent = sense so. # land_sound → fitxer .wav reproduït en aterrar. # L'alçada del cos viu al bloc `collision:` (`height`), igual que la resta # d'entitats: és una propietat de col·lisió, no de la física del salt. # Amb impulse=240 i gravity=600: pic ≈ 48 px, temps total en l'aire ≈ 0.8 s. jump: impulse: 200 gravity: 600 landing_stun_ms: 300 shadow_y_offset: 3 sound: jump.wav land_sound: land.wav # Estat HURT: el jugador queda projectat sense control per un impacte # (algú que cau al damunt; en el futur també fuetada de l'altre jugador). # `enterHurt` tria automàticament la direcció amb més recorregut lliure # entre els 4 cardinals, posa la velocitat inicial a `speed` i la fa # decaure linealment fins a 0 en `brake_time_ms`. Si pel camí xoca amb # un mur, para en sec. En tornar a velocitat 0, recupera l'estat # GROUNDED i el control. Mentre dura, no col·lisiona amb altres jugadors. # Amb speed=120 i brake_time=500ms ⇒ recorregut ≈ 30 px (≈2 tiles). hurt: speed: 120 brake_time_ms: 500