Untitled

mail@pastecode.io avatar
unknown
plain_text
7 months ago
6.5 kB
1
Indexable
Never
import kaboom from "kaboom"

// initialize context
kaboom({
  background: [0, 0, 0]
})
//Ladataan hahmot/palikat
loadSprite("block", "sprites/block.png");
loadSprite("blue-block", "sprites/blue-block.png");
loadSprite("blue-brick", "sprites/blue-brick.png");
loadSprite("blue-evil-shroom", "sprites/blue-evil-shroom.png");
loadSprite("blue-steel", "sprites/blue-steel.png");
loadSprite("blue-surprise", "sprites/blue-surprise.png");
loadSprite("brick", "sprites/brick.png");
loadSprite("coin", "sprites/coin.png");
loadSprite("evil-shroom-1", "sprites/evil-shroom-1.png");
loadSprite("mario-standing", "sprites/mario-standing.png");
loadSprite("mushroom", "sprites/mushroom.png");
loadSprite("pipe-top", "sprites/pipe-top.png");
loadSprite("pipe-left", "sprites/Pipe-Left.png");
loadSprite("pipe-right", "sprites/Pipe-Right.png");
loadSprite("pipe-upper-left", "sprites/Pipe-Upper-Left.png");
loadSprite("pipe-upper-right", "sprites/Pipe-Upper-Right.png");
loadSprite("question", "sprites/question.png");
loadSprite("unboxed", "sprites/unboxed.png");
scene("game", ({ level, score }) =>{
layers(['bg', 'obj', 'ui'], 'obj')
const move_speed = 120
const jump_force = 400
const big_jump_force = 550
let current_jump_force = jump_force
const ENEMY_MOVESPEED = 30
const FALL_DEATH = 600
let isJumping = true
//Kartta ja muuttujat
const maps = [
  [
    '                                   ',
    '                                   ',
    '                                   ',
    '                                   ',
    '                                   ',
    '      %    =*=%                    ',
    '                                   ',
    '                          -+       ',
    '                 ^   ^    ()       ',
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxx    xxx',
  ], [
    '£                                 £',
    '£                                 £',
    '£                                 £',
    '£         @@@@@      s            £',
    '£                  s s s          £',
    '£                s s s s s      -+£',
    '£      !       s s s s s s      ()£',
    'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
  ]
]


const levelCfg = {
  width: 20,
  height: 20,
  '=': () => [sprite('block'), solid(), area()],
  'x': () => [sprite('brick'), solid(), area()],
  '$': () => [sprite('coin'), 'coin', area()],
  '%': () => [sprite('question'), 'coin-surprise', scale(0.5), solid(), area()],
  '*': () => [sprite('question'), 'mushroom-surprise', scale(0.5), solid(), area()],
  '}': () => [sprite('unboxed'), solid(), area()],
  '(': () => [sprite('pipe-left'), scale(0.5), solid(), area()],
  ')': () => [sprite('pipe-right'), scale(0.5), solid(), area()],
  '-': () => [sprite('pipe-upper-left'), scale(0.5), solid(), area(), 'pipe'],
  '+': () => [sprite('pipe-upper-right'), scale(0.5), solid(), area(), 'pipe'],
  '^': () => [sprite('evil-shroom-1'), body(), area(), solid(), 'dangerous'],
  '#': () => [sprite('mushroom'), 'mushroom', body(), area(),],
  '£': () => [sprite('blue-brick'), solid(), area(), scale(0.5),],
  'z': () => [sprite('blue-block'), solid(), area(), scale(0.5),],
  '@': () => [sprite('blue-surprise'), solid(), area(), 'coin-surprise'],
  '!': () => [sprite('blue-evil-shroom'), 'dangerous', scale(0.5), body(), area()],
  's': () => [sprite('blue-steel'), solid(), area(), scale(0.5),],
}
const gameLevel = addLevel(maps[level], levelCfg)

//Pistemäärä -teksti
const scoreGlobal = 0
const scoreLabel = add([
  text(scoreGlobal, { font: "sink" }),
  pos(30, 6),
  scale(1.5),
  layer('ui'),
  {
    value: scoreGlobal,
  }
])

//Taso -teksti
add([text('level ' + parseInt(level + 1), { font: "sink" }), pos(50, 6), scale(1.5)])

//Kun Mario saa sienen...
function big() {
  let timer = 0
  let isBig = false
  return {
    update() {
      if (isBig) { //Mario suurenee joksikin aikaa ja palaa takaisin ennalleen
        timer -= dt()
        if (timer <= 0) {
          this.smallify()
        }
      }
    },
    isBig() {
      return isBig
    }, //Muokataan hyppykorkeudet niin, että isompi Mario hyppää korkeammalle
    smallify() {
      this.scale = vec2(1)
      timer = 0
      isBig = false
      current_jump_force = jump_force
    },
    biggify(time) {
      this.scale = vec2(1.99)
      timer = time
      isBig = true
      current_jump_force = big_jump_force
    }
  }
}

//Pelaajan muuttujat
const player = add([
  sprite('mario-standing'),
  pos(30, 0),
  body(),
  area(),
  big()
])

player.action(() => {
  camPos(player.pos)
  if (player.pos.y >= FALL_DEATH) {
    go('lose', { score: scoreLabel.value })
  }
})

//Kun painetaan 'vasen nuolta' tai 'oikeaa nuolta', hahmo liikkuu sivuille
keyDown('left', () => {
  player.move(-move_speed, 0)
})
keyDown('right', () => {
  player.move(move_speed, 0)
})
player.action(() => {
  if (player.grounded()) {
    isJumping = false
  }
})
keyDown('space', () => {
  if (player.grounded()) {
    isJumping = true
    player.jump(current_jump_force)
  }
})

//Kun Mario lyö päänsä 'erityispalikoihin', niistä ilmestyy kolikoita tai sieniä
player.on('headbutt', (obj) => {
  if (obj.is('coin-surprise')) {
    gameLevel.spawn('$', obj.gridPos.sub(0, 1)),
      destroy(obj),
      gameLevel.spawn('}', obj.gridPos.sub(0, 0))
  }
  if (obj.is('mushroom-surprise')) {
    gameLevel.spawn('#', obj.gridPos.sub(0, 1)),
      destroy(obj),
      gameLevel.spawn('}', obj.gridPos.sub(0, 0))
  }
})
//Kun pelaaja menee piipusta alas, pääsee uuteen tasoon
player.collides('pipe', () => {
  keyPress('down', () => {
    go("game", {
      level: (level + 1) % maps.length,
      score: scoreLabel.value
    })
  })
})
//Sieni pistetään liikkumaan
action('mushroom', (m) => {
  m.move(20, 0)
})
//Kun Mario osuu sieneen, hän suurenee ja sieni katoaa
player.collides('mushroom', (m) => {
  player.biggify(6)
  destroy(m)
})
//Kun Mario ottaa kolikon, saa yhden pistemäärän lisää ja se päivitetään tekstiin, kolikko lopulta tuhotaan 
player.collides('coin', (c) => {
  scoreLabel.value++
  scoreLabel.text = scoreLabel.value
  destroy(c)
})

action('dangerous', (d) => {
  d.move(-ENEMY_MOVESPEED, 0)
})

player.collides('dangerous', (d) => {
  if (isJumping) {
    destroy(d)
  } else {
    go('lose', { score: scoreLabel.value })
  }
})

scene('lose', () => {
  add([
    text("GAME OVER! SCORE: " + scoreLabel.value, { size: 35, font: "sink" }),
    pos(width() / 2, height() / 2),
    origin("center"),
    layer("ui"),
  ])
})
  })
go("game", { level: 0, score: 0})