Created
May 28, 2011 15:32
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### | |
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