floatingpointisation
This commit is contained in:
parent
068fdd65af
commit
5c132631b3
83
main.fs
83
main.fs
|
@ -1,5 +1,8 @@
|
||||||
\ JAVAPOOL - THE GAME (an incremental game based on the lore of #javapool on tilde.town)
|
\ JAVAPOOL - THE GAME (an incremental game based on the lore of #javapool on tilde.town)
|
||||||
\ this code likely sucks, because I'm bad at forth and figuring stuff out as I go.
|
\ this code likely sucks, because I'm bad at forth and figuring stuff out as I go.
|
||||||
|
\ written for 64-bit gforth, might be portable to other forths with some tweaking, idk.
|
||||||
|
|
||||||
|
include debug.fs
|
||||||
|
|
||||||
\ ANSI escape sequences. gforth already provides at-xy and page, but I also need a word for clearing the current line and displaying the cursor.
|
\ ANSI escape sequences. gforth already provides at-xy and page, but I also need a word for clearing the current line and displaying the cursor.
|
||||||
: hide-cursor esc[ ." ?25l" ;
|
: hide-cursor esc[ ." ?25l" ;
|
||||||
|
@ -18,15 +21,13 @@
|
||||||
\ the word changed? leaves a -1 if the value has changed since last clear, 0 otherwise.
|
\ the word changed? leaves a -1 if the value has changed since last clear, 0 otherwise.
|
||||||
: changed? ( addr offset -- flag ) cells + @ ;
|
: changed? ( addr offset -- flag ) cells + @ ;
|
||||||
|
|
||||||
\ initialise some variables that encode game state.
|
|
||||||
\ the variable "counter" holds the count of the current tick. It always starts at 0.
|
|
||||||
variable counter
|
|
||||||
\ the variable "devices" holds the amount of devices currently in the pool. It has a change flag. It begins with the change flag set, to draw the screen the first time.
|
\ the variable "devices" holds the amount of devices currently in the pool. It has a change flag. It begins with the change flag set, to draw the screen the first time.
|
||||||
create devices 0 , -1 ,
|
\ this variable can contain decimal-point amounts of devices. Things that need a non-decimal amount can round it with ftrunc.
|
||||||
\ the variable "devicerate" is the amount of ticks between devices getting added.
|
create devices 0e f, -1 ,
|
||||||
variable devicerate
|
\ the variable "base-devices/tick" is the base amount of devices added per tick.
|
||||||
2000 devicerate !
|
variable base-devices/tick
|
||||||
\ the variable "membercost" is the cost of hiring a new chat member. If it is zero, hiring chat members hasn't been unlocked yet. It has a change flag.
|
0.0005e base-devices/tick f!
|
||||||
|
\ the variable "membercost" is the cost of hiring a new chat member. If it is zero, hiring chat members hasn't been unlocked yet. It has a change flag and is fixed-point.
|
||||||
create membercost 0 , 0 ,
|
create membercost 0 , 0 ,
|
||||||
\ the variable "membercount" is how many chat members you've hired. For each chat member, device gain delay decreases.
|
\ the variable "membercount" is how many chat members you've hired. For each chat member, device gain delay decreases.
|
||||||
variable membercount
|
variable membercount
|
||||||
|
@ -43,16 +44,21 @@ variable count-messages-shown
|
||||||
\ set an initial message
|
\ set an initial message
|
||||||
S" you feel like throwing some stuff into the pool." set-message
|
S" you feel like throwing some stuff into the pool." set-message
|
||||||
|
|
||||||
|
\ f+! is +! for floats
|
||||||
|
: f+! ( addr -- ) ( F: r -- ) dup f@ f+ f! ;
|
||||||
|
|
||||||
\ any-change? leaves a -1 on the stack if any value has changed, 0 otherwise
|
\ any-change? leaves a -1 on the stack if any value has changed, 0 otherwise
|
||||||
: any-change? ( -- flag ) membercost 1 changed? devices 1 changed? message 2 changed? or or ;
|
: any-change? ( -- flag ) membercost 1 changed? devices 1 changed? message 2 changed? or or ;
|
||||||
\ clear-all clears the change flag on all values.
|
\ clear-all clears the change flag on all values.
|
||||||
: clear-all membercost 1 cleared devices 1 cleared message 2 cleared ;
|
: clear-all membercost 1 cleared devices 1 cleared message 2 cleared ;
|
||||||
\ the word !0= tests if something is non-zero
|
\ the word !0= tests if something is non-zero
|
||||||
: !0= 0= 0= ;
|
: !0= ( n -- flag ) 0= 0= ;
|
||||||
|
\ the word f!0= tests if a floating thing is non-zero
|
||||||
|
: f!0= ( r -- flag ) f0= 0= ;
|
||||||
|
|
||||||
\ the world unlock-members tests to see if hiring chat members can be unlocked. if so, they are unlocked.
|
\ the world unlock-members tests to see if hiring chat members can be unlocked. if so, they are unlocked.
|
||||||
: unlock-members
|
: unlock-members
|
||||||
devices @ 5 = membercost @ 0= and if
|
devices f@ ftrunc 5e f= membercost @ 0= and if
|
||||||
10 membercost !
|
10 membercost !
|
||||||
S" A friendly townie wants to help out." set-message then ;
|
S" A friendly townie wants to help out." set-message then ;
|
||||||
|
|
||||||
|
@ -62,23 +68,34 @@ S" you feel like throwing some stuff into the pool." set-message
|
||||||
\ the word wait-tick waits a tick. Ticks are 1ms currently.
|
\ the word wait-tick waits a tick. Ticks are 1ms currently.
|
||||||
: wait-tick 1 ms ;
|
: wait-tick 1 ms ;
|
||||||
|
|
||||||
\ the word tick-up ticks the counter up
|
\ the word debug-console is used for entering debug mode.
|
||||||
: tick-up 1 counter +! ;
|
: debug-console
|
||||||
|
page
|
||||||
|
." Entering debug/cheat shell. use `restart` to restart the game." cr
|
||||||
|
.s cr f.s
|
||||||
|
quit ;
|
||||||
|
|
||||||
|
\ devices/tick calculates the amount of devices that are to be added per tick.
|
||||||
|
: devices/tick ( f: -- r )
|
||||||
|
base-devices/tick f@
|
||||||
|
membercount @ s>f 2000e f/ \ each member adds 0.5 d/s
|
||||||
|
f+ ;
|
||||||
|
|
||||||
\ set-count-message sets the message to certain things based on the amount of devices in the pool. The count-messages-shown variable is used to track how many of these have already been shown.
|
\ set-count-message sets the message to certain things based on the amount of devices in the pool. The count-messages-shown variable is used to track how many of these have already been shown.
|
||||||
: set-count-message
|
: set-count-message
|
||||||
devices @ 50 > count-messages-shown @ 1 < and if
|
devices f@ ftrunc 50e f> count-messages-shown @ 1 < and if
|
||||||
S" The pool is starting to look a little cluttered. " set-message
|
S" The pool is starting to look a little cluttered. " set-message
|
||||||
1 count-messages-shown +!
|
1 count-messages-shown +!
|
||||||
then ;
|
then ;
|
||||||
|
|
||||||
\ the word game-tick runs a single tick of the game
|
\ the word game-tick runs a single tick of the game
|
||||||
: game-tick tick-up unlock
|
: game-tick unlock
|
||||||
counter @ devicerate @ mod 0= if
|
devices/tick devices f+!
|
||||||
1 devices +!
|
|
||||||
set-count-message
|
set-count-message
|
||||||
devices 1 changed then ;
|
\ TODO only set devices as changed on an integer change
|
||||||
|
\ this seems to somehow cause a float overflow lol
|
||||||
|
devices 1 changed
|
||||||
|
;
|
||||||
|
|
||||||
\ TODO saving
|
\ TODO saving
|
||||||
\ the word exit-game exits the game.
|
\ the word exit-game exits the game.
|
||||||
|
@ -86,33 +103,20 @@ S" you feel like throwing some stuff into the pool." set-message
|
||||||
|
|
||||||
|
|
||||||
\ the word hire-chat-member hires a chat member.
|
\ the word hire-chat-member hires a chat member.
|
||||||
\ TODO something funky is going on with the rate past a certain point. find out where and why.
|
\ TODO subtract the membercost from the
|
||||||
\ goes negative at 12 members, seems to be doing weird stuff before that with speeds.
|
\ goes negative at 12 members, seems to be doing weird stuff before that with speeds.
|
||||||
: hire-chat-member
|
: hire-chat-member
|
||||||
membercost @ dup !0= swap \ checks if member cost is nonzero, leaving member cost on the stack
|
membercost @ dup !0= swap \ checks if member cost is nonzero, leaving member cost on the stack
|
||||||
devices @ <= \ tests if the member cost is less than the amount of devices we have
|
s>f devices f@ f<= \ tests if the member cost (converted to a float) is less than the amount of devices we have
|
||||||
and if
|
and if
|
||||||
devices @ membercost @ - devices ! \ remove devices that "pay" for the member
|
." hit!"
|
||||||
membercount @ dup !0= if \ membercount is nonzero
|
devices f@ membercost @ s>f f- devices f! \ remove devices that pay for the member
|
||||||
devicerate @ swap 1 + 750 swap / - devicerate ! \ TODO this line is causing the weirdness
|
|
||||||
else
|
|
||||||
devicerate @ 750 - devicerate ! drop
|
|
||||||
then
|
|
||||||
1 membercount +! \ add a member to the count
|
1 membercount +! \ add a member to the count
|
||||||
membercount @ 2 * 5 + membercost +! \ increase the cost of buying a new member
|
membercount @ 2 * 5 + membercost +! \ increase the cost of buying a new member
|
||||||
membercost 1 changed
|
membercost 1 changed
|
||||||
S" " set-message \ blank the message, because we did a thing.
|
S" " set-message \ blank the message, because we did a thing.
|
||||||
then ;
|
then ;
|
||||||
|
|
||||||
\ the word debug-console is used for entering debug mode.
|
|
||||||
: debug-console
|
|
||||||
page
|
|
||||||
." Entering debug/cheat shell. use `restart` to restart the game."
|
|
||||||
quit ;
|
|
||||||
|
|
||||||
\ throw-device throws a device into the pool.
|
|
||||||
\ : throw-device 1 devices +! devices 1 changed ;
|
|
||||||
|
|
||||||
\ the word handle-input handles input every time around the game loop.
|
\ the word handle-input handles input every time around the game loop.
|
||||||
: handle-input
|
: handle-input
|
||||||
key? if key case
|
key? if key case
|
||||||
|
@ -126,7 +130,7 @@ S" you feel like throwing some stuff into the pool." set-message
|
||||||
: print-rate
|
: print-rate
|
||||||
2 set-precision
|
2 set-precision
|
||||||
\ first convert to floating point, divide by 1000 to get seconds from milliseconds, then do 1/n to get the devices/second from seconds/device
|
\ first convert to floating point, divide by 1000 to get seconds from milliseconds, then do 1/n to get the devices/second from seconds/device
|
||||||
." (" devicerate @ s>f 1000e f/ 1e fswap f/ f. ." devices/second)";
|
." (" devices/tick 1000e f* f. ." devices/second)" ;
|
||||||
|
|
||||||
\ draw-message draws the stored message on the screen.
|
\ draw-message draws the stored message on the screen.
|
||||||
: draw-message
|
: draw-message
|
||||||
|
@ -135,7 +139,7 @@ S" you feel like throwing some stuff into the pool." set-message
|
||||||
|
|
||||||
\ draw-devices draws the number of devices on the screen.
|
\ draw-devices draws the number of devices on the screen.
|
||||||
: draw-devices
|
: draw-devices
|
||||||
devices @ dup
|
devices f@ f>s dup
|
||||||
1 1 at-xy
|
1 1 at-xy
|
||||||
clear-line
|
clear-line
|
||||||
1 = if ." There is 1 device in the javapool." drop else
|
1 = if ." There is 1 device in the javapool." drop else
|
||||||
|
@ -158,10 +162,11 @@ S" you feel like throwing some stuff into the pool." set-message
|
||||||
." (q)uit (without saving)" ;
|
." (q)uit (without saving)" ;
|
||||||
|
|
||||||
\ draw-screen redraws the screen, but only if there's been a change.
|
\ draw-screen redraws the screen, but only if there's been a change.
|
||||||
: draw-screen any-change? if draw-devices draw-actions draw-message clear-all then ;
|
: draw-screen any-change? if draw-devices draw-actions draw-message clear-all then ;
|
||||||
|
\ : draw-screen clear-all ;
|
||||||
|
|
||||||
\ main game loop
|
\ main game loop
|
||||||
: game-loop begin wait-tick game-tick handle-input draw-screen 0 until ;
|
: game-loop begin wait-tick game-tick handle-input draw-screen 0 until ;
|
||||||
|
|
||||||
\ the seconds, minutes and hours words are used with skip-time in debugging.
|
\ the seconds, minutes and hours words are used with skip-time in debugging.
|
||||||
: seconds 1000 * ;
|
: seconds 1000 * ;
|
||||||
|
@ -175,4 +180,4 @@ S" you feel like throwing some stuff into the pool." set-message
|
||||||
: restart page game-loop ;
|
: restart page game-loop ;
|
||||||
|
|
||||||
\ clear the screen and start the game
|
\ clear the screen and start the game
|
||||||
page hide-cursor game-loop ;
|
page hide-cursor game-loop
|
||||||
|
|
Reference in New Issue