Skip to content

Instantly share code, notes, and snippets.

@electronicwhisper
Created May 28, 2011 15:32
Show Gist options
  • Save electronicwhisper/996951 to your computer and use it in GitHub Desktop.
Save electronicwhisper/996951 to your computer and use it in GitHub Desktop.
first draft of a sample program (the game Safari!) in a Totem-like language
###
Systems
###
system "World",
state:
worldWidth: 800
worldHeight: 600
initial: (self) ->
spawn "Hunter", name: "Player 1", keys: "wsadc"
spawn "Hunter", name: "Player 2", keys: "ikjln"
for [1..10] ->
spawn "Dodo", x: Math.random() * self.get("worldWidth"), y: Math.random() * self.get("worldHeight")
system "Sprite",
state:
x: 0
y: 0
system "Mover",
extends: "Sprite"
state:
angle: 0
velocity: 0
angleVelocity: 0
system "Fleeting",
state:
timeAlive: 1000
system "Hunter",
extends: "Mover"
state:
name: ""
keys: ""
speed: 3
angleSpeed: 2
system "Bullet",
extends: ["Mover", "Fleeting"]
state:
timeAlive: 1000
shooter: null
velocity: 10
system "Dodo",
extends: "Sprite"
state:
radius: 10
system "DeadDodo",
extends: ["Sprite", "Fleeting"]
state:
timeAlive: 400
###
Interactions
pre-supposes systems:
Time, which triggers a tick(dt) event as often as it can
Keyboard, which triggers keyDown(char) and keyUp(char) events
###
# move Movers based on their velocity
interact "Time", "Mover", (time, mover) ->
time.tick.listen (dt) ->
mover.set({
x: mover.get("x") + mover.get("velocity") * Math.cos(mover.get("angle")) * dt
y: mover.get("y") + mover.get("velocity") * Math.sin(mover.get("angle")) * dt
angle: mover.get("angle") + mover.get("angleVelocity") * dt
})
# change the velocity of Hunter based on keyboard presses, also fire Bullets
interact "Keyboard", "Hunter", (keyboard, hunter) ->
keyboard.keyDown (char) ->
switch char
when hunter.get("keys").charAt(0)
hunter.set(velocity: hunter.get("speed"))
when hunter.get("keys").charAt(1)
hunter.set(velocity: -hunter.get("speed"))
when hunter.get("keys").charAt(2)
hunter.set(angleVelocity: -hunter.get("angleSpeed"))
when hunter.get("keys").charAt(3)
hunter.set(angleVelocity: hunter.get("angleSpeed"))
when hunter.get("keys").charAt(4)
spawn "Bullet", shooter: hunter, x: hunter.get("x"), y: hunter.get("y"), angle: hunter.get("angle")
keyboard.keyUp (char) ->
switch char
when hunter.get("keys").charAt(0), hunter.get("keys").charAt(1)
hunter.set(velocity: 0)
when hunter.get("keys").charAt(2), hunter.get("keys").charAt(3)
hunter.set(angleVelocity: 0)
# destroy Bullets and Dodos when they're within Dodo's radius
interact "Bullet", "Dodo", (bullet, dodo) ->
bullet.listen "x", "y", (x, y) ->
if Math.pow(x - dodo.get("x"), 2) + Math.pow(y - dodo.get("y"), 2) < Math.pow(dodo.get("radius"), 2)
dodo.transition("DeadDodo")
bullet.destroy()
# destroy Fleeting if it's been around too long
interact "Time", "Fleeting", (time, fleeting) ->
time.tick.listen (dt) ->
fleeting.set(timeAlive: fleeting.get("timeAlive") - dt)
if (fleeting.get("timeAlive") <= 0)
fleeting.destroy()
###
TODO:
make a win condition when the last Dodo is killed
add multiple clients
transition the world based on when games have started
###
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment