Added 10 more gists.

This commit is contained in:
Miguel Astor
2023-06-19 09:38:01 -04:00
parent 8af706e97d
commit 1400a87eab
25 changed files with 1133 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
A short story about a programmer, written in programming.
Forked from [ncase/SarahTheSpaceSpy.js](https://gist.github.com/ncase/6451ba18325edac8681d)

View File

@@ -0,0 +1,94 @@
StartDayAgain = ->
do sarah.wakeUp
# What if my life was like a movie? In space?
sarah.goto "Bathroom"
sarah.exit sarah.pajamas
sarah.clean sarah
sarah.clean sarah.teeth
sarah.enter sarah.clothes
# I'd jump into my spaceship, and fly off to
# Astroexplorer Headquarters, reporting for duty.
sarah.goto "Garage"
sarah.enter sarah.car
sarah.goto "Monolith Software Corp."
sarah.exit sarah.car
sarah.goto "My Cubicle"
# And I'd be the most popular gal on board.
# Everyone would love Agent #001, SARAH THE SPACE SPY
if sarah.meets "coworker" then sarah.say "Hi." else sarah.say null
sarah.enter sarah.cubicle
# Yes, Agent #001 uses her hacking skills to break into
# alien computer networks, steal their secret technology,
# and help humanity take over the galaxy!
until isCurrentTime "12:30"
if numTasksLeft > 0 then do sarah.work else do sarah.pretendToWork
# Hold up, gotta refuel my engines.
sarah.exit sarah.cubicle
food.enter sarah
sarah.enter sarah.cubicle
# And, back to my mission! You think SARAH THE SPACE SPY
# would simply walk away from a long list of impossible tasks?
# Ha! I may rest, but I do not give up.
# AGENT #001 NEVER GIVES UP.
until isCurrentTime "17:00"
do sarah.pretendToWork
# Even though SARAH THE SPACE SPY could take on the whole
# universe by herself, she's loyal to the human race.
# She's selfless. Always ready to take one for the team.
until isCurrentTime "17:15"
do sarah.pretendToWork
# Thanks to SARAH, humanity is safe once again. All in a day's work.
# Now, it's time to fly back to my planetary base station.
sarah.enter sarah.car
sarah.goto "Home"
# Fade to black. Roll credits.
sarah.exit sarah.car
sarah.goto "Living Room"
# Yeah. That would be a great movie. I'd totally watch it.
sarah.watch "Classic Sci-fi Shows on Netflix"
sarah.watch "Space Documentaries on YouTube"
sarah.watch "funny cat gifs"
# One day, I'll write up that sci-fi young adult novel.
# I swear! I made it my New Year's Resolution again this year,
# because I haven't given up. Agent #001 never gives up.
sarah.goto "Bathroom"
sarah.exit sarah.clothes
food.exit sarah
sarah.clean sarah
sarah.clean sarah.teeth
sarah.enter sarah.pajamas
# I'm just too busy... There's no time right now.
# I just gotta keep on working, keep on moving up,
# and one day, I'll have all the free time in the world!
# Then... Then, I can start living my life.
sarah.goto "Bedroom"
do sarah.sleep
# ...one day.
do StartDayAgain

1
TONES.ASM/README.md Normal file
View File

@@ -0,0 +1 @@
DOS (tasm) program that sets a custom handler for interrupt 9h to play a tone on every key press.

59
TONES.ASM/TONES.ASM Normal file
View File

@@ -0,0 +1,59 @@
.model tiny
.386
.code
org 100h
start:
;; Save old interrupt handler
mov ax, 3509h ; DOS function: get address of INT 9h handler
int 21h ; Call DOS
mov [i9_or], bx ; Offset
mov [i9_or + 2], es ; Segment
;; Set new interrupt handler
cli ; Disable interruptions
lea dx, interr ; Load address of custom handler
mov ax, 2509h ; DOS function: replace handler for INT 9h
int 21h ; Call DOS
sti ; Re-enable interruptions
;; End program, TSR style
mov ax, 3100h ; DOS function: Terminate and stay resident
mov dx, 00ffh ; Keep 255 bytes resident
int 21h ; Call DOS
i9_or dw ?, ? ; Here we save the DOS INT 9h handler
interr proc far
sti ; Re-enable interruptions
;; Initialize the speaker
in al, 61h ; Get speaker status word
push ax ; Save status word
or al, 00000011b ; Turn speaker on
out 61h, al ; Send new status word to speaker
mov al, 60 ; Set initial tone
;; Play a tone on the speaker
L2: out 42h, al ; Send tone to timer chip
mov cx, 100 ; Set outer counter
L3: push cx ; Save inner counter
mov cx, 0D00h ; Set inner counter
L3a: loop L3a ; Loop until inner counter is 0
pop cx ; Restore outer counter
loop L3 ; Loop until outer counter is 0
sub al, 1 ; Change tone
jnz L2 ; Repeat until tone is 0
;; Disable speaker
pop ax ; Restore original speaker status word
and al, 11111100b ; Turn speaker off
out 61h, al ; Send status word to speaker
;; Jump to the original keyboard handler
;; The next two instructions set the return address on the stack
push word ptr [cs:i9_or + 2]
push word ptr [cs:i9_or]
retf ; Return from this procedure
interr endp
end start

View File

@@ -0,0 +1 @@
Coffeescript implementation of the MDN Breakout tutorial from [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript)

View File

@@ -0,0 +1,155 @@
canvas = document.getElementById "myCanvas"
ctx = canvas.getContext "2d"
# Player
score = 0
lives = 3
drawScore = ->
ctx.font = "16px Arial"
ctx.fillStyle = "#0095DD"
ctx.fillText "Score: " + score, 8, 20
drawLives = ->
ctx.font = "16px Arial"
ctx.fillStyle = "#0095DD"
ctx.fillText "Lives: " + lives, canvas.width - 65, 20
# Ball
x = canvas.width / 2
y = canvas.height - 30
dx = 2
dy = -2
ballRadius = 10
drawBall = ->
do ctx.beginPath
ctx.arc x, y, ballRadius, 0, Math.PI * 2
ctx.fillStyle = "#0095DD"
do ctx.fill
do ctx.closePath
# Paddle
paddleHeight = 10
paddleWidth = 75
paddleX = (canvas.width - paddleWidth) / 2
rightPressed = false
leftPressed = false
drawPaddle = ->
do ctx.beginPath
ctx.rect paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight
ctx.fillStyle = "#0095DD"
do ctx.fill
do ctx.closePath
# Bricks
brickRowCount = 3
brickColumnCount = 5
brickWidth = 75
brickHeight = 20
brickPadding = 10
brickOffsetTop = 30
brickOffsetLeft = 30
bricks = []
for c in [0 ... brickColumnCount]
bricks[c] = []
for r in [0 ... brickRowCount]
bricks[c][r] =
x: (c * (brickWidth + brickPadding)) + brickOffsetLeft,
y: (r * (brickHeight + brickPadding)) + brickOffsetTop,
active: true
drawBricks = ->
drawSingleBrick = (brick) ->
do ctx.beginPath
ctx.rect brick.x, brick.y, brickWidth, brickHeight
ctx.fillStyle = "#0095DD"
do ctx.fill
do ctx.closePath
for col in bricks
for b in col
drawSingleBrick b if b.active
collisionDetection = ->
for col in bricks
for b in col
if b.active and x > b.x and x < b.x + brickWidth and y > b.y and y < b.y + brickHeight
dy = -dy
b.active = false
score++
if score == brickRowCount * brickColumnCount
alert "A winner is you!"
do document.location.reload
# Game loop
gameLoop = ->
ctx.clearRect 0, 0, canvas.width, canvas.height
do drawBricks
do drawBall
do drawPaddle
do drawScore
do drawLives
do collisionDetection
x += dx
y += dy
dx = -dx if (x + dx > canvas.width - ballRadius) or (x + dx < ballRadius)
dy = -dy if (y + dy < ballRadius)
if y + dy > canvas.height - ballRadius
if x > paddleX and x < paddleX + paddleWidth
dy = -dy - 0.25
if dx >= 0 then dx += 0.25 else dx -= 0.25
else
lives--
if not lives
alert "Game over, man!"
do document.location.reload
else
x = canvas.width / 2
y = canvas.height - 30
dx = 2
dy = -2
paddleX = (canvas.width - paddleWidth) / 2
paddleX += 7 if rightPressed and paddleX < canvas.width - paddleWidth
paddleX -= 7 if leftPressed and paddleX > 0
requestAnimationFrame gameLoop
# Input handlers
keyDownHandler = (e) ->
if e.keyCode == 39
rightPressed = true
else if e.keyCode == 37
leftPressed = true
keyUpHandler = (e) ->
if e.keyCode == 39
rightPressed = false
else if e.keyCode == 37
leftPressed = false
mouseMoveHandler = (e) ->
hw = (paddleWidth / 2)
relativeX = e.clientX - canvas.offsetLeft
paddleX = relativeX - hw if relativeX > hw and relativeX < canvas.width - hw
# Initialization
document.addEventListener "keydown", keyDownHandler, false
document.addEventListener "keyup", keyUpHandler, false
document.addEventListener "mousemove", mouseMoveHandler, false
do gameLoop

234
breakout.coffee/breakout.js Normal file
View File

@@ -0,0 +1,234 @@
// Generated by CoffeeScript 2.3.2
(function() {
var ballRadius, brickColumnCount, brickHeight, brickOffsetLeft, brickOffsetTop, brickPadding, brickRowCount, brickWidth, bricks, c, canvas, collisionDetection, ctx, drawBall, drawBricks, drawLives, drawPaddle, drawScore, dx, dy, gameLoop, i, j, keyDownHandler, keyUpHandler, leftPressed, lives, mouseMoveHandler, paddleHeight, paddleWidth, paddleX, r, ref, ref1, rightPressed, score, x, y;
canvas = document.getElementById("myCanvas");
ctx = canvas.getContext("2d");
// Player
score = 0;
lives = 3;
drawScore = function() {
ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
return ctx.fillText("Score: " + score, 8, 20);
};
drawLives = function() {
ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
return ctx.fillText("Lives: " + lives, canvas.width - 65, 20);
};
// Ball
x = canvas.width / 2;
y = canvas.height - 30;
dx = 2;
dy = -2;
ballRadius = 10;
drawBall = function() {
ctx.beginPath();
ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
ctx.fillStyle = "#0095DD";
ctx.fill();
return ctx.closePath();
};
// Paddle
paddleHeight = 10;
paddleWidth = 75;
paddleX = (canvas.width - paddleWidth) / 2;
rightPressed = false;
leftPressed = false;
drawPaddle = function() {
ctx.beginPath();
ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
return ctx.closePath();
};
// Bricks
brickRowCount = 3;
brickColumnCount = 5;
brickWidth = 75;
brickHeight = 20;
brickPadding = 10;
brickOffsetTop = 30;
brickOffsetLeft = 30;
bricks = [];
for (c = i = 0, ref = brickColumnCount; (0 <= ref ? i < ref : i > ref); c = 0 <= ref ? ++i : --i) {
bricks[c] = [];
for (r = j = 0, ref1 = brickRowCount; (0 <= ref1 ? j < ref1 : j > ref1); r = 0 <= ref1 ? ++j : --j) {
bricks[c][r] = {
x: (c * (brickWidth + brickPadding)) + brickOffsetLeft,
y: (r * (brickHeight + brickPadding)) + brickOffsetTop,
active: true
};
}
}
drawBricks = function() {
var b, col, drawSingleBrick, k, len, results;
drawSingleBrick = function(brick) {
ctx.beginPath();
ctx.rect(brick.x, brick.y, brickWidth, brickHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
return ctx.closePath();
};
results = [];
for (k = 0, len = bricks.length; k < len; k++) {
col = bricks[k];
results.push((function() {
var l, len1, results1;
results1 = [];
for (l = 0, len1 = col.length; l < len1; l++) {
b = col[l];
if (b.active) {
results1.push(drawSingleBrick(b));
} else {
results1.push(void 0);
}
}
return results1;
})());
}
return results;
};
collisionDetection = function() {
var b, col, k, len, results;
results = [];
for (k = 0, len = bricks.length; k < len; k++) {
col = bricks[k];
results.push((function() {
var l, len1, results1;
results1 = [];
for (l = 0, len1 = col.length; l < len1; l++) {
b = col[l];
if (b.active && x > b.x && x < b.x + brickWidth && y > b.y && y < b.y + brickHeight) {
dy = -dy;
b.active = false;
score++;
if (score === brickRowCount * brickColumnCount) {
alert("A winner is you!");
results1.push(document.location.reload());
} else {
results1.push(void 0);
}
} else {
results1.push(void 0);
}
}
return results1;
})());
}
return results;
};
// Game loop
gameLoop = function() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBricks();
drawBall();
drawPaddle();
drawScore();
drawLives();
collisionDetection();
x += dx;
y += dy;
if ((x + dx > canvas.width - ballRadius) || (x + dx < ballRadius)) {
dx = -dx;
}
if (y + dy < ballRadius) {
dy = -dy;
}
if (y + dy > canvas.height - ballRadius) {
if (x > paddleX && x < paddleX + paddleWidth) {
dy = -dy - 0.25;
if (dx >= 0) {
dx += 0.25;
} else {
dx -= 0.25;
}
} else {
lives--;
if (!lives) {
alert("Game over, man!");
document.location.reload();
} else {
x = canvas.width / 2;
y = canvas.height - 30;
dx = 2;
dy = -2;
paddleX = (canvas.width - paddleWidth) / 2;
}
}
}
if (rightPressed && paddleX < canvas.width - paddleWidth) {
paddleX += 7;
}
if (leftPressed && paddleX > 0) {
paddleX -= 7;
}
return requestAnimationFrame(gameLoop);
};
// Input handlers
keyDownHandler = function(e) {
if (e.keyCode === 39) {
return rightPressed = true;
} else if (e.keyCode === 37) {
return leftPressed = true;
}
};
keyUpHandler = function(e) {
if (e.keyCode === 39) {
return rightPressed = false;
} else if (e.keyCode === 37) {
return leftPressed = false;
}
};
mouseMoveHandler = function(e) {
var hw, relativeX;
hw = paddleWidth / 2;
relativeX = e.clientX - canvas.offsetLeft;
if (relativeX > hw && relativeX < canvas.width - hw) {
return paddleX = relativeX - hw;
}
};
// Initialization
document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);
document.addEventListener("mousemove", mouseMoveHandler, false);
gameLoop();
}).call(this);

View File

@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Gamedev Canvas Workshop</title>
<style>
* { padding: 0; margin: 0; }
canvas { background: #eee; display: block; margin: 0 auto; }
</style>
</head>
<body>
<canvas id="myCanvas" width="480" height="320"></canvas>
<script src="breakout.js"></script>
</body>
</html>

View File

@@ -0,0 +1 @@
Coffeescript implementation of the MDN Breakout tutorial with Phaser V2 from [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser/Randomizing_gameplay)

View File

@@ -0,0 +1,151 @@
ball = null
paddle = null
bricks = null
newBrick = null
brickInfo = null
scoreText = null
score = 0
textStyle =
font: "18px Arial"
fill: "#0095DD"
lives = 3
livesText = null
lifeLostText = null
playing = false
startButton = null
startGame = ->
do startButton.destroy
ball.body.velocity.set 150, -150
playing = true
ballLeaveScreen = ->
playing = false
lives--
if lives
livesText.setText "Lives: " + lives
lifeLostText.visible = true
ball.reset game.world.width * 0.5, game.world.height - 25
paddle.reset game.world.width * 0.5, game.world.height - 5
game.input.onDown.addOnce ->
lifeLostText.visible = false
ball.body.velocity.set 150, -150
playing = true
, this
else
alert "Game over, man!"
do location.reload
initBricks = ->
brickInfo =
width: 50
height: 20
count:
row: 3
col: 7
offset:
top: 50
left: 60
padding: 10
bricks = do game.add.group
for c in [0 ... brickInfo.count.col]
for r in [0 ... brickInfo.count.row]
brickX = (c * (brickInfo.width + brickInfo.padding)) + brickInfo.offset.left
brickY = (r * (brickInfo.height + brickInfo.padding)) + brickInfo.offset.top
newBrick = game.add.sprite brickX, brickY, "brick"
game.physics.enable newBrick, Phaser.Physics.ARCADE
newBrick.body.immovable = true
newBrick.anchor.set 0.5
bricks.add newBrick
ballHitBrick = (ball, brick) ->
target =
x: 0
y: 0
killTween = game.add.tween brick.scale
killTween.to target =
x: 0
y: 0
, 200, Phaser.Easing.Linear.None
killTween.onComplete.addOnce ->
do brick.kill
, this
do killTween.start
score += 10
scoreText.setText "Points: " + score
if score == brickInfo.count.row * brickInfo.count.col * 10
alert "A winner is you!"
do location.reload
ball.animations.play "wobble"
ballHitPaddle = (ball, paddle) ->
ball.animations.play "wobble"
ball.body.velocity.x = -1 * 5 * (paddle.x - ball.x)
preload = ->
# Set basic game properties
game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL
game.scale.pageAlignHorizontally = true
game.scale.pageAlignVertically = true
game.stage.backgroundColor = "#eee"
# Load texture images
game.load.image "paddle", "img/paddle.png"
game.load.image "brick", "img/brick.png"
game.load.spritesheet "ball", "img/wobble.png", 20, 20
game.load.spritesheet "button", "img/button.png", 120, 40
create = ->
# Initialize the physics engine
game.physics.startSystem Phaser.Physics.ARCADE
game.physics.arcade.checkCollision.down = false
# Create the ball sprite and set it"s properties
ball = game.add.sprite game.world.width * 0.5, game.world.height - 25, "ball"
ball.animations.add "wobble", [0, 1, 0, 2, 0, 1, 0, 2, 0], 24
ball.anchor.set 0.5
game.physics.enable ball, Phaser.Physics.ARCADE
ball.body.bounce.set 1
ball.body.collideWorldBounds = true
ball.checkWorldBounds = true
ball.events.onOutOfBounds.add ballLeaveScreen, this
# Create the paddle sprite and set it"s properties
paddle = game.add.sprite game.world.width * 0.5, game.world.height - 5, "paddle"
paddle.anchor.set 0.5, 1
game.physics.enable paddle, Phaser.Physics.ARCADE
paddle.body.immovable = true
# Brick creation
do initBricks
# Scorekeeping
scoreText = game.add.text 5, 5, "Points: 0", textStyle
# Player lives
livesText = game.add.text game.world.width - 5, 5, "Lives: " + lives, textStyle
livesText.anchor.set 1, 0
lifeLostText = game.add.text game.world.width * 0.5, game.world.height * 0.5, 'Life lost, click to continue', textStyle
lifeLostText.anchor.set 0.5
lifeLostText.visible = false
# Start button
startButton = game.add.button game.world.width * 0.5, game.world.height * 0.5, "button", startGame, this, 1, 0, 2
startButton.anchor.set 0.5
update = ->
game.physics.arcade.collide ball, paddle, ballHitPaddle
game.physics.arcade.collide ball, bricks, ballHitBrick
paddle.x = game.input.x or (game.world.width * 0.5) if playing
functions =
preload: preload,
create: create,
update: update
game = new Phaser.Game 480, 320, Phaser.CANVAS, null, functions

View File

@@ -0,0 +1,186 @@
// Generated by CoffeeScript 2.3.2
(function() {
var ball, ballHitBrick, ballHitPaddle, ballLeaveScreen, brickInfo, bricks, create, functions, game, initBricks, lifeLostText, lives, livesText, newBrick, paddle, playing, preload, score, scoreText, startButton, startGame, textStyle, update;
ball = null;
paddle = null;
bricks = null;
newBrick = null;
brickInfo = null;
scoreText = null;
score = 0;
textStyle = {
font: "18px Arial",
fill: "#0095DD"
};
lives = 3;
livesText = null;
lifeLostText = null;
playing = false;
startButton = null;
startGame = function() {
startButton.destroy();
ball.body.velocity.set(150, -150);
return playing = true;
};
ballLeaveScreen = function() {
playing = false;
lives--;
if (lives) {
livesText.setText("Lives: " + lives);
lifeLostText.visible = true;
ball.reset(game.world.width * 0.5, game.world.height - 25);
paddle.reset(game.world.width * 0.5, game.world.height - 5);
return game.input.onDown.addOnce(function() {
lifeLostText.visible = false;
ball.body.velocity.set(150, -150);
return playing = true;
}, this);
} else {
alert("Game over, man!");
return location.reload();
}
};
initBricks = function() {
var brickX, brickY, c, i, r, ref, results;
brickInfo = {
width: 50,
height: 20,
count: {
row: 3,
col: 7
},
offset: {
top: 50,
left: 60
},
padding: 10
};
bricks = game.add.group();
results = [];
for (c = i = 0, ref = brickInfo.count.col; (0 <= ref ? i < ref : i > ref); c = 0 <= ref ? ++i : --i) {
results.push((function() {
var j, ref1, results1;
results1 = [];
for (r = j = 0, ref1 = brickInfo.count.row; (0 <= ref1 ? j < ref1 : j > ref1); r = 0 <= ref1 ? ++j : --j) {
brickX = (c * (brickInfo.width + brickInfo.padding)) + brickInfo.offset.left;
brickY = (r * (brickInfo.height + brickInfo.padding)) + brickInfo.offset.top;
newBrick = game.add.sprite(brickX, brickY, "brick");
game.physics.enable(newBrick, Phaser.Physics.ARCADE);
newBrick.body.immovable = true;
newBrick.anchor.set(0.5);
results1.push(bricks.add(newBrick));
}
return results1;
})());
}
return results;
};
ballHitBrick = function(ball, brick) {
var killTween, target;
target = {
x: 0,
y: 0
};
killTween = game.add.tween(brick.scale);
killTween.to(target = {
x: 0,
y: 0
}, 200, Phaser.Easing.Linear.None);
killTween.onComplete.addOnce(function() {
return brick.kill();
}, this);
killTween.start();
score += 10;
scoreText.setText("Points: " + score);
if (score === brickInfo.count.row * brickInfo.count.col * 10) {
alert("A winner is you!");
location.reload();
}
return ball.animations.play("wobble");
};
ballHitPaddle = function(ball, paddle) {
ball.animations.play("wobble");
return ball.body.velocity.x = -1 * 5 * (paddle.x - ball.x);
};
preload = function() {
// Set basic game properties
game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
game.scale.pageAlignHorizontally = true;
game.scale.pageAlignVertically = true;
game.stage.backgroundColor = "#eee";
// Load texture images
game.load.image("paddle", "img/paddle.png");
game.load.image("brick", "img/brick.png");
game.load.spritesheet("ball", "img/wobble.png", 20, 20);
return game.load.spritesheet("button", "img/button.png", 120, 40);
};
create = function() {
// Initialize the physics engine
game.physics.startSystem(Phaser.Physics.ARCADE);
game.physics.arcade.checkCollision.down = false;
// Create the ball sprite and set it"s properties
ball = game.add.sprite(game.world.width * 0.5, game.world.height - 25, "ball");
ball.animations.add("wobble", [0, 1, 0, 2, 0, 1, 0, 2, 0], 24);
ball.anchor.set(0.5);
game.physics.enable(ball, Phaser.Physics.ARCADE);
ball.body.bounce.set(1);
ball.body.collideWorldBounds = true;
ball.checkWorldBounds = true;
ball.events.onOutOfBounds.add(ballLeaveScreen, this);
// Create the paddle sprite and set it"s properties
paddle = game.add.sprite(game.world.width * 0.5, game.world.height - 5, "paddle");
paddle.anchor.set(0.5, 1);
game.physics.enable(paddle, Phaser.Physics.ARCADE);
paddle.body.immovable = true;
// Brick creation
initBricks();
// Scorekeeping
scoreText = game.add.text(5, 5, "Points: 0", textStyle);
// Player lives
livesText = game.add.text(game.world.width - 5, 5, "Lives: " + lives, textStyle);
livesText.anchor.set(1, 0);
lifeLostText = game.add.text(game.world.width * 0.5, game.world.height * 0.5, 'Life lost, click to continue', textStyle);
lifeLostText.anchor.set(0.5);
lifeLostText.visible = false;
// Start button
startButton = game.add.button(game.world.width * 0.5, game.world.height * 0.5, "button", startGame, this, 1, 0, 2);
return startButton.anchor.set(0.5);
};
update = function() {
game.physics.arcade.collide(ball, paddle, ballHitPaddle);
game.physics.arcade.collide(ball, bricks, ballHitBrick);
if (playing) {
return paddle.x = game.input.x || (game.world.width * 0.5);
}
};
functions = {
preload: preload,
create: create,
update: update
};
game = new Phaser.Game(480, 320, Phaser.CANVAS, null, functions);
}).call(this);

View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Gamedev Phaser Workshop - lesson 01: Initialize the framework</title>
<style>* { padding: 0; margin: 0; }</style>
<script src="js/phaser.min.js"></script>
</head>
<body>
<!-- Get the assets from here https://github.com/end3r/Gamedev-Phaser-Content-Kit/tree/gh-pages/demos/img -->
<script src="js/breakout_phaser.js"></script>
</body>
</html>

1
flatten.sh/README.md Normal file
View File

@@ -0,0 +1 @@
A Bash script that recursively searches for files in subdirectories of PWD and moves them to PWD.

24
flatten.sh/flatten.sh Normal file
View File

@@ -0,0 +1,24 @@
#! /bin/bash
BASE_DIR=`pwd`
for dir in `ls -1 $BASE_DIR`
do
if [[ -d $dir ]]
then
cd $dir
for i in `seq 1 100`
do
FILE=`ls -1`
if [[ -d "$FILE" ]]
then
cd $FILE
else
break
fi
done
mv "$FILE" $BASE_DIR
cd $BASE_DIR
rm -rf $dir
fi
done

1
hello.s/README.md Normal file
View File

@@ -0,0 +1 @@
Abusing x86_64 assembly language to print Hello, World!

10
hello.s/hello.s Normal file
View File

@@ -0,0 +1,10 @@
.section .text
.globl main
.byte 72, 101, 108, 108, 111, 44, 32, 87
.byte 111, 114, 108, 100, 33, 10, 0
main:
.quad 0x01c0c748e5894855
.quad 0xffee358d48000000
.quad 0xc7480fee8348ffff
.quad 0xc9050f0000000ec2
.byte 0xc3

1
pin_fetcher.py/README.md Normal file
View File

@@ -0,0 +1 @@
A python 3 script that fetches a bunch of images listed as urls on a text file.

View File

@@ -0,0 +1,96 @@
#!/usr/bin/env python3
##
# Specially useful to make backups of your Pinterest boards when used together with
# the pins_from_cache.js script.
##
import argparse
import requests
import io
import time
from PIL import Image
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Download photos from a Pinterest URL list")
parser.add_argument('-u', '--urls', help='The URL list txt file')
parser.add_argument('-d', '--delay', type=int, default=1, help='Delay in seconds between downloads.')
args = parser.parse_args()
delay = args.delay
resume = False
target = 0
if resume:
with open("log", "r") as log:
target = int(log.readline())
with open(args.urls, "r") as f:
line = 0
for url in f:
try:
if resume and line < target:
continue
success = False
url = url.strip()
# Request the image
print("Fetching: " + url)
req = requests.get(url)
print(req.status_code)
if req.status_code == 200:
# Save the image to file on success.
img = Image.open(io.BytesIO(req.content)).convert('RGB')
img.save(url.split("/")[-1])
success = True
else:
# Attempt to download the image as a PNG on error
url = url.replace(".jpg", ".png")
print("JPG failed")
print("Fetching: " + url)
req = requests.get(url)
print(req.status_code)
if req.status_code == 200:
# Save the image to file on success.
img = Image.open(io.BytesIO(req.content))
img.save(url.split("/")[-1])
success = True
else:
# Attempt to download the image as a GIF on error
url = url.replace(".png", ".gif")
print("PNG failed")
print("Fetching: " + url)
req = requests.get(url)
print(req.status_code)
if req.status_code == 200:
# Save the image to file on success.
with open(url.split("/")[-1], "wb") as f:
# Workaround for a PIL bug when saving GIF files
for chunk in req.iter_content(chunk_size=128):
f.write(chunk)
success = True
elif req.status_code == 403:
# Log the error if JPG, PNG and GIF failed
print("Failed to download: " + url)
# Log the image if the download was successful
if success:
with open("log", "w") as log:
log.write(str(line))
except Exception as e:
print(e)
line += 1
# Wait
time.sleep(delay)

View File

@@ -0,0 +1,24 @@
/**
* Script taken and very slightly modified from here:
* https://32hertz.blogspot.com/2015/06/how-to-download-all-pictures-from.html
*
* Open the Firefox cache screen (about:cache, then click on list cache entries on the Disk section),
* then run this script on the Firefox console to get all links for Pinterest images that you have seen.
* Copy all the links in a .txt file and you can use img_spider.py to download them all.
**/
var a = document.getElementsByTagName("a");
var img;
var i = -1;
var body = document.getElementsByTagName("body");
var div = document.createElement("div");
var jpglink='';
while(++i<a.length){
if(a[i].toString().indexOf("236x")>0){
jpglink = document.createTextNode(a[i].innerHTML.replace("236x","originals"));
div.appendChild(jpglink);
div.appendChild(document.createElement("br"));
}
}
body[0].insertBefore(div,body[0].childNodes[0]);

View File

@@ -0,0 +1 @@
Bash script that prints all JPEG and PNG images inside the working directory.

View File

@@ -0,0 +1,19 @@
#! /bin/bash
FILES=`ls -1 *.[jp]*`
ORIENTATION=" "
for f in $FILES
do
WIDTH=`identify $f | cut -d' ' -f3 | cut -d'x' -f1`
HEIGHT=`identify $f | cut -d' ' -f3 | cut -d'x' -f2`
if [ $WIDTH -lt $HEIGHT ]
then
ORIENTATION="portrait"
else
ORIENTATION="landscape"
fi
echo "Printing $f"
echo
lpr -o $ORIENTATION -o scaling=100 -o media=letter -o color=grayscale -o PrintQuality=photo $f
done

1
qs.coffee/README.md Normal file
View File

@@ -0,0 +1 @@
Quicksort implementation in Coffeescript for practice.

13
qs.coffee/qs.coffee Normal file
View File

@@ -0,0 +1,13 @@
#! /usr/bin/env coffee
test = [20, 16, 5, 10, 3, 17, 12, 1, 19, 6, 13, 4, 18, 11, 7, 9, 8, 16, 0, 2, 14, 15]
quicksort = (list) ->
return [] if list.length == 0
return list if list.length == 1
pvt = list.shift()
ltp = (elem for elem in list when elem < pvt)
gtp = (elem for elem in list when elem >= pvt)
return (quicksort ltp).concat [pvt], quicksort gtp
console.log quicksort test

1
smash.s/README.md Normal file
View File

@@ -0,0 +1 @@
Smashing the stack for fun and no profit.

28
smash.s/smash.s Normal file
View File

@@ -0,0 +1,28 @@
.section .rodata
str:
.asciz "Smashed!"
.section .text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
call function
xorl %eax, %eax
leave
ret
function:
pushq %rbp
movq %rsp, %rbp
leaq smash(%rip), %r8
movq %r8, 8(%rbp)
leave
ret
smash:
leaq str(%rip), %rdi
call puts@plt
movq $60, %rax
movq $89, %rdi
syscall