Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into auxtools-atmos
This commit is contained in:
@@ -109,4 +109,4 @@
|
||||
else if (world.time > detectTime)
|
||||
detectTime = 0
|
||||
for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines)
|
||||
TV.notify(FALSE)
|
||||
TV.notify(FALSE)
|
||||
|
||||
@@ -106,15 +106,15 @@
|
||||
dat += "<input type='hidden' name='matrix_paint' value='1'"
|
||||
dat += "<br><br>"
|
||||
dat += MATRIX_FIELD("rr", color_matrix_last[1])
|
||||
dat += MATRIX_FIELD("gr", color_matrix_last[2])
|
||||
dat += MATRIX_FIELD("br", color_matrix_last[3])
|
||||
dat += MATRIX_FIELD("gr", color_matrix_last[4])
|
||||
dat += MATRIX_FIELD("br", color_matrix_last[7])
|
||||
dat += "<br><br>"
|
||||
dat += MATRIX_FIELD("rg", color_matrix_last[4])
|
||||
dat += MATRIX_FIELD("rg", color_matrix_last[2])
|
||||
dat += MATRIX_FIELD("gg", color_matrix_last[5])
|
||||
dat += MATRIX_FIELD("bg", color_matrix_last[6])
|
||||
dat += MATRIX_FIELD("bg", color_matrix_last[8])
|
||||
dat += "<br><br>"
|
||||
dat += MATRIX_FIELD("rb", color_matrix_last[7])
|
||||
dat += MATRIX_FIELD("gb", color_matrix_last[8])
|
||||
dat += MATRIX_FIELD("rb", color_matrix_last[3])
|
||||
dat += MATRIX_FIELD("gb", color_matrix_last[6])
|
||||
dat += MATRIX_FIELD("bb", color_matrix_last[9])
|
||||
dat += "<br><br>"
|
||||
dat += MATRIX_FIELD("cr", color_matrix_last[10])
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
blocked = TRUE
|
||||
var/attackamt = rand(2,6)
|
||||
temp = "You attack for [attackamt] damage!"
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
|
||||
updateUsrDialog()
|
||||
if(turtle > 0)
|
||||
turtle--
|
||||
@@ -74,7 +74,7 @@
|
||||
var/pointamt = rand(1,3)
|
||||
var/healamt = rand(6,8)
|
||||
temp = "You use [pointamt] magic to heal for [healamt] damage!"
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
|
||||
updateUsrDialog()
|
||||
turtle++
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
blocked = TRUE
|
||||
var/chargeamt = rand(4,7)
|
||||
temp = "You regain [chargeamt] points"
|
||||
playsound(loc, 'sound/arcade/mana.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3)
|
||||
player_mp += chargeamt
|
||||
if(turtle > 0)
|
||||
turtle--
|
||||
@@ -124,7 +124,7 @@
|
||||
if(!gameover)
|
||||
gameover = TRUE
|
||||
temp = "[enemy_name] has fallen! Rejoice!"
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3)
|
||||
|
||||
if(obj_flags & EMAGGED)
|
||||
new /obj/effect/spawner/newbomb/timer/syndicate(loc)
|
||||
@@ -141,13 +141,13 @@
|
||||
else if ((obj_flags & EMAGGED) && (turtle >= 4))
|
||||
var/boomamt = rand(5,10)
|
||||
temp = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!"
|
||||
playsound(loc, 'sound/arcade/boom.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/boom.ogg', 50, TRUE, extrarange = -3)
|
||||
player_hp -= boomamt
|
||||
|
||||
else if ((enemy_mp <= 5) && (prob(70)))
|
||||
var/stealamt = rand(2,3)
|
||||
temp = "[enemy_name] steals [stealamt] of your power!"
|
||||
playsound(loc, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3)
|
||||
player_mp -= stealamt
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -155,27 +155,27 @@
|
||||
gameover = TRUE
|
||||
sleep(turn_speed)
|
||||
temp = "You have been drained! GAME OVER"
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
|
||||
if(obj_flags & EMAGGED)
|
||||
usr.gib()
|
||||
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "mana", (obj_flags & EMAGGED ? "emagged":"normal")))
|
||||
|
||||
else if ((enemy_hp <= 10) && (enemy_mp > 4))
|
||||
temp = "[enemy_name] heals for 4 health!"
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
|
||||
enemy_hp += 4
|
||||
enemy_mp -= 4
|
||||
|
||||
else
|
||||
var/attackamt = rand(3,6)
|
||||
temp = "[enemy_name] attacks for [attackamt] damage!"
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
|
||||
player_hp -= attackamt
|
||||
|
||||
if ((player_mp <= 0) || (player_hp <= 0))
|
||||
gameover = TRUE
|
||||
temp = "You have been crushed! GAME OVER"
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
|
||||
if(obj_flags & EMAGGED)
|
||||
usr.gib()
|
||||
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (obj_flags & EMAGGED ? "emagged":"normal")))
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
columns = 0
|
||||
mine_placed = 0
|
||||
if(href_list["Easy"])
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
@@ -87,7 +87,7 @@
|
||||
columns = 10
|
||||
mine_limit = 10
|
||||
if(href_list["Intermediate"])
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
@@ -96,7 +96,7 @@
|
||||
columns = 17
|
||||
mine_limit = 40
|
||||
if(href_list["Hard"])
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
@@ -110,9 +110,9 @@
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
difficulty = "Custom"
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
if(href_list["Flag"])
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
if(!flagging)
|
||||
flagging = TRUE
|
||||
flag_text = "ON"
|
||||
@@ -122,10 +122,10 @@
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, FALSE, extrarange = -3)
|
||||
web += "<font size='2'>Explode in the game, explode in real life!<br>What difficulty do you want to play?<br><br><br><br><b><a href='byond://?src=[REF(src)];Easy=1'><font color='#cc66ff'>Easy (9x9 board, 10 mines)</font></a><br><a href='byond://?src=[REF(src)];Intermediate=1'><font color='#cc66ff'>Intermediate (16x16 board, 40 mines)</font></a><br><a href='byond://?src=[REF(src)];Hard=1'><font color='#cc66ff'>Hard (16x30 board, 99 mines)</font></a><br><a href='byond://?src=[REF(src)];Custom=1'><font color='#cc66ff'>Custom</font>"
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, FALSE, extrarange = -3)
|
||||
web += web_difficulty_menu
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_PLAYING)
|
||||
@@ -152,7 +152,7 @@
|
||||
if(table[y1][x1] < 10 && table[y1][x1] >= 0) //Check that it's not already revealed, and stop flag removal if we're out of flag mode
|
||||
table[y1][x1] += 10
|
||||
if(table[y1][x1] != 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
else
|
||||
if(game_status != MINESWEEPER_GAME_LOST && game_status != MINESWEEPER_GAME_WON)
|
||||
game_status = MINESWEEPER_GAME_LOST
|
||||
@@ -164,14 +164,14 @@
|
||||
if(mine_sound)
|
||||
switch(rand(1,3)) //Play every time a mine is hit
|
||||
if(1)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, FALSE, extrarange = -3)
|
||||
if(2)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, FALSE, extrarange = -3)
|
||||
if(3)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, FALSE, extrarange = -3)
|
||||
mine_sound = FALSE
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
if(table[y1][x1] >= 0) //Check that it's not already flagged
|
||||
table[y1][x1] -= 10
|
||||
else if(table[y1][x1] < 0) //If flagged, remove the flag
|
||||
@@ -182,7 +182,7 @@
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
if(table[y1][x1] >= 10) //If revealed, become unrevealed!
|
||||
if(mine_sound)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
mine_sound = FALSE
|
||||
table[y1][x1] -= 10
|
||||
if(table[y1][x1] > 10 && !reset_board)
|
||||
@@ -243,10 +243,10 @@
|
||||
if(safe_squares_revealed >= win_condition && game_status == MINESWEEPER_GAME_PLAYING)
|
||||
game_status = MINESWEEPER_GAME_WON
|
||||
if(rows < 10 || columns < 10) //If less than easy difficulty
|
||||
playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, FALSE, extrarange = -3)
|
||||
say("You cleared the board of all mines, but you picked too small of a board! Try again with at least a 9x9 board!")
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, FALSE, extrarange = -3)
|
||||
say("You cleared the board of all mines! Congratulations!")
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
var/itemname
|
||||
@@ -299,32 +299,32 @@
|
||||
ENABLE_BITFIELD(obj_flags, EMAGGED)
|
||||
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
|
||||
to_chat(user, "<span class='warning'>An ominous tune plays from the arcade's speakers!</span>")
|
||||
playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, 0, extrarange = 3, falloff = 10)
|
||||
playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, FALSE, extrarange = 3)
|
||||
else //Can't let you do that, star fox!
|
||||
to_chat(user, "<span class='warning'>The machine buzzes and sparks... the game has been reset!</span>")
|
||||
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, 0, extrarange = 3, falloff = 10) //Loud buzz
|
||||
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, FALSE, extrarange = 3) //Loud buzz
|
||||
game_status = MINESWEEPER_GAME_MAIN_MENU
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) //Entered into the menu so ping sound
|
||||
var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num
|
||||
if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
new_rows = clamp(new_rows + 1, 4, 30)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num
|
||||
if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
new_columns = clamp(new_columns + 1, 4, 50)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
var/grid_area = (new_rows - 1) * (new_columns - 1)
|
||||
var/lower_limit = round(grid_area*0.156)
|
||||
var/upper_limit = round(grid_area*0.85)
|
||||
var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num
|
||||
if(!new_mine_limit || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
rows = new_rows
|
||||
columns = new_columns
|
||||
mine_limit = clamp(new_mine_limit, lower_limit, upper_limit)
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
to_chat(c_user, "<span class='warning'>You move your hand towards the machine, and begin to hesitate as a bloodied guillotine emerges from inside of it...</span>")
|
||||
if(do_after(c_user, 50, target = src))
|
||||
to_chat(c_user, "<span class='userdanger'>The guillotine drops on your arm, and the machine sucks it in!</span>")
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1)
|
||||
var/which_hand = BODY_ZONE_L_ARM
|
||||
if(!(c_user.active_hand_index % 2))
|
||||
which_hand = BODY_ZONE_R_ARM
|
||||
var/obj/item/bodypart/chopchop = c_user.get_bodypart(which_hand)
|
||||
chopchop.dismember()
|
||||
qdel(chopchop)
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3)
|
||||
for(var/i=1; i<=rand(3,5); i++)
|
||||
prizevend(user)
|
||||
else
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
name = "gas sensor"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "gsensor1"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 0)
|
||||
|
||||
var/on = TRUE
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
. = ..()
|
||||
SSradio.remove_object(src, air_frequency)
|
||||
air_connection = SSradio.add_object(src, air_frequency, RADIO_TO_AIRALARM)
|
||||
open()
|
||||
INVOKE_ASYNC(src, .proc/open)
|
||||
|
||||
/obj/machinery/door/airlock/alarmlock/receive_signal(datum/signal/signal)
|
||||
..()
|
||||
|
||||
@@ -774,6 +774,9 @@
|
||||
stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg'
|
||||
armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 80, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/pod/toolbox
|
||||
max_integrity = 100
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/shuttle/target(atom/movable/target)
|
||||
if(target)
|
||||
setDir(get_dir(base, target))//even if you can't shoot, follow the target
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
|
||||
/obj/machinery/quantumpad/proc/doteleport(mob/user, obj/machinery/quantumpad/target_pad = linked_pad)
|
||||
if(target_pad)
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE)
|
||||
teleporting = TRUE
|
||||
|
||||
spawn(teleport_speed)
|
||||
@@ -155,9 +155,9 @@
|
||||
target_pad.sparks()
|
||||
|
||||
flick("qpad-beam", src)
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE)
|
||||
flick("qpad-beam", target_pad)
|
||||
playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
|
||||
playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, TRUE)
|
||||
for(var/atom/movable/ROI in get_turf(src))
|
||||
if(QDELETED(ROI))
|
||||
continue //sleeps in CHECK_TICK
|
||||
|
||||
@@ -100,51 +100,54 @@
|
||||
eat(AM)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/recycler/proc/eat(atom/AM0)
|
||||
if(stat & (BROKEN|NOPOWER) || safety_mode)
|
||||
/obj/machinery/recycler/proc/eat(atom/movable/AM0, sound=TRUE)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(safety_mode)
|
||||
return
|
||||
if(!isturf(AM0.loc))
|
||||
return //I don't know how you called Crossed() but stop it.
|
||||
|
||||
var/list/to_eat
|
||||
var/list/to_eat = AM0.GetAllContents()
|
||||
|
||||
to_eat = list(AM0)
|
||||
var/living_detected = FALSE //technically includes silicons as well but eh
|
||||
var/list/nom = list()
|
||||
var/list/crunchy_nom = list() //Mobs have to be handled differently so they get a different list instead of checking them multiple times.
|
||||
|
||||
var/items_recycled = 0
|
||||
var/buzz = FALSE
|
||||
for(var/i in to_eat)
|
||||
var/atom/movable/AM = i
|
||||
if(QDELETED(AM))
|
||||
continue
|
||||
var/obj/item/bodypart/head/as_head = AM
|
||||
var/obj/item/mmi/as_mmi = AM
|
||||
var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay)
|
||||
if(brain_holder)
|
||||
if(obj_flags & EMAGGED)
|
||||
continue
|
||||
else
|
||||
emergency_stop(AM)
|
||||
return
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/bodypart/head/as_head = AM
|
||||
var/obj/item/mmi/as_mmi = AM
|
||||
if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay))
|
||||
living_detected = TRUE
|
||||
nom += AM
|
||||
else if(isliving(AM))
|
||||
if((obj_flags & EMAGGED)||((!allowed(AM))&&(!ishuman(AM))))
|
||||
to_eat += crush_living(AM)
|
||||
else
|
||||
emergency_stop(AM)
|
||||
return
|
||||
else if(isitem(AM))
|
||||
var/obj/O = AM
|
||||
if(O.resistance_flags & INDESTRUCTIBLE)
|
||||
buzz = TRUE
|
||||
O.forceMove(loc)
|
||||
else
|
||||
to_eat += recycle_item(AM)
|
||||
items_recycled++
|
||||
else
|
||||
buzz = TRUE
|
||||
AM.forceMove(loc)
|
||||
|
||||
if(items_recycled)
|
||||
playsound(src, item_recycle_sound, 50, 1)
|
||||
if(buzz)
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
living_detected = TRUE
|
||||
crunchy_nom += AM
|
||||
var/not_eaten = to_eat.len - nom.len - crunchy_nom.len
|
||||
if(living_detected) // First, check if we have any living beings detected.
|
||||
if(obj_flags & EMAGGED)
|
||||
for(var/CRUNCH in crunchy_nom) // Eat them and keep going because we don't care about safety.
|
||||
if(isliving(CRUNCH)) // MMIs and brains will get eaten like normal items
|
||||
crush_living(CRUNCH)
|
||||
else // Stop processing right now without eating anything.
|
||||
emergency_stop()
|
||||
return
|
||||
for(var/nommed in nom)
|
||||
recycle_item(nommed)
|
||||
if(nom.len && sound)
|
||||
playsound(src, item_recycle_sound, (50 + nom.len*5), TRUE, nom.len, ignore_walls = (nom.len - 10)) // As a substitute for playing 50 sounds at once.
|
||||
if(not_eaten)
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', (50 + not_eaten*5), FALSE, not_eaten, ignore_walls = (not_eaten - 10)) // Ditto.
|
||||
if(!ismob(AM0))
|
||||
AM0.moveToNullspace()
|
||||
qdel(AM0)
|
||||
else // Lets not move a mob to nullspace and qdel it, yes?
|
||||
for(var/i in AM0.contents)
|
||||
var/atom/movable/content = i
|
||||
content.moveToNullspace()
|
||||
qdel(content)
|
||||
|
||||
/obj/machinery/recycler/proc/recycle_item(obj/item/I)
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#define SPIN_TIME 65 //As always, deciseconds.
|
||||
#define REEL_DEACTIVATE_DELAY 7
|
||||
#define SEVEN "<font color='red'>7</font>"
|
||||
#define HOLOCHIP 1
|
||||
#define COIN 2
|
||||
|
||||
/obj/machinery/computer/slot_machine
|
||||
name = "slot machine"
|
||||
@@ -21,40 +23,48 @@
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 50
|
||||
circuit = /obj/item/circuitboard/computer/slot_machine
|
||||
light_color = LIGHT_COLOR_BROWN
|
||||
var/money = 3000 //How much money it has CONSUMED
|
||||
var/plays = 0
|
||||
var/working = 0
|
||||
var/working = FALSE
|
||||
var/balance = 0 //How much money is in the machine, ready to be CONSUMED.
|
||||
var/jackpots = 0
|
||||
var/paymode = HOLOCHIP //toggles between HOLOCHIP/COIN, defined above
|
||||
var/cointype = /obj/item/coin/iron //default cointype
|
||||
var/list/coinvalues = list()
|
||||
var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0)
|
||||
var/list/symbols = list(SEVEN = 1, "<font color='orange'>&</font>" = 2, "<font color='yellow'>@</font>" = 2, "<font color='green'>$</font>" = 2, "<font color='blue'>?</font>" = 2, "<font color='grey'>#</font>" = 2, "<font color='white'>!</font>" = 2, "<font color='fuchsia'>%</font>" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much.
|
||||
|
||||
light_color = LIGHT_COLOR_BROWN
|
||||
|
||||
/obj/machinery/computer/slot_machine/Initialize()
|
||||
. = ..()
|
||||
jackpots = rand(1, 4) //false hope
|
||||
plays = rand(75, 200)
|
||||
|
||||
toggle_reel_spin(1) //The reels won't spin unless we activate them
|
||||
INVOKE_ASYNC(src, .proc/toggle_reel_spin, TRUE)//The reels won't spin unless we activate them
|
||||
|
||||
var/list/reel = reels[1]
|
||||
for(var/i = 0, i < reel.len, i++) //Populate the reels.
|
||||
randomize_reels()
|
||||
|
||||
toggle_reel_spin(0)
|
||||
INVOKE_ASYNC(src, .proc/toggle_reel_spin, FALSE)
|
||||
|
||||
for(cointype in typesof(/obj/item/coin))
|
||||
var/obj/item/coin/C = new cointype
|
||||
coinvalues["[cointype]"] = C.get_item_credit_value()
|
||||
qdel(C) //Sigh
|
||||
|
||||
/obj/machinery/computer/slot_machine/Destroy()
|
||||
if(balance)
|
||||
give_coins(balance)
|
||||
give_payout(balance)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/slot_machine/process()
|
||||
/obj/machinery/computer/slot_machine/process(delta_time)
|
||||
. = ..() //Sanity checks.
|
||||
if(!.)
|
||||
return .
|
||||
|
||||
money++ //SPESSH MAJICKS
|
||||
money += round(delta_time / 2) //SPESSH MAJICKS
|
||||
|
||||
/obj/machinery/computer/slot_machine/update_icon_state()
|
||||
if(stat & NOPOWER)
|
||||
@@ -69,27 +79,46 @@
|
||||
else
|
||||
icon_state = "slots1"
|
||||
|
||||
/obj/machinery/computer/slot_machine/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/slot_machine/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/coin))
|
||||
var/obj/item/coin/C = I
|
||||
if(prob(2))
|
||||
if(!user.transferItemToLoc(C, drop_location()))
|
||||
return
|
||||
C.throw_at(user, 3, 10)
|
||||
if(prob(10))
|
||||
balance = max(balance - SPIN_PRICE, 0)
|
||||
to_chat(user, "<span class='warning'>[src] spits your coin back out!</span>")
|
||||
if(paymode == COIN)
|
||||
if(prob(2))
|
||||
if(!user.transferItemToLoc(C, drop_location()))
|
||||
return
|
||||
C.throw_at(user, 3, 10)
|
||||
if(prob(10))
|
||||
balance = max(balance - SPIN_PRICE, 0)
|
||||
to_chat(user, "<span class='warning'>[src] spits your coin back out!</span>")
|
||||
|
||||
else
|
||||
if(!user.temporarilyRemoveItemFromInventory(C))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You insert [C] into [src]'s slot!</span>")
|
||||
balance += C.value
|
||||
qdel(C)
|
||||
else
|
||||
if(!user.temporarilyRemoveItemFromInventory(C))
|
||||
to_chat(user, "<span class='warning'>This machine is only accepting holochips!</span>")
|
||||
else if(istype(I, /obj/item/holochip))
|
||||
if(paymode == HOLOCHIP)
|
||||
var/obj/item/holochip/H = I
|
||||
if(!user.temporarilyRemoveItemFromInventory(H))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You insert [C] into [src]'s slot!</span>")
|
||||
balance += C.value
|
||||
qdel(C)
|
||||
to_chat(user, "<span class='notice'>You insert [H.credits] holocredits into [src]'s slot!</span>")
|
||||
balance += H.credits
|
||||
qdel(H)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>This machine is only accepting coins!</span>")
|
||||
else if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
if(balance > 0)
|
||||
visible_message("<b>[src]</b> says, 'ERROR! Please empty the machine balance before altering paymode'") //Prevents converting coins into holocredits and vice versa
|
||||
else
|
||||
if(paymode == HOLOCHIP)
|
||||
paymode = COIN
|
||||
visible_message("<b>[src]</b> says, 'This machine now works with COINS!'")
|
||||
else
|
||||
paymode = HOLOCHIP
|
||||
visible_message("<b>[src]</b> says, 'This machine now works with HOLOCHIPS!'")
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -101,8 +130,7 @@
|
||||
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(4, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(src, "sparks", 50, 1)
|
||||
return TRUE
|
||||
playsound(src, "sparks", 50, TRUE)
|
||||
|
||||
/obj/machinery/computer/slot_machine/ui_interact(mob/living/user)
|
||||
. = ..()
|
||||
@@ -127,8 +155,9 @@
|
||||
<A href='?src=[REF(src)];spin=1'>Play!</A><BR>
|
||||
<BR>
|
||||
[reeltext]
|
||||
<BR>
|
||||
<font size='1'><A href='?src=[REF(src)];refund=1'>Refund balance</A><BR>"}
|
||||
<BR>"}
|
||||
if(balance > 0)
|
||||
dat+="<font size='1'><A href='?src=[REF(src)];refund=1'>Refund balance</A><BR>"
|
||||
|
||||
var/datum/browser/popup = new(user, "slotmachine", "Slot Machine")
|
||||
popup.set_content(dat)
|
||||
@@ -143,21 +172,22 @@
|
||||
spin(usr)
|
||||
|
||||
else if(href_list["refund"])
|
||||
give_coins(balance)
|
||||
balance = 0
|
||||
if(balance > 0)
|
||||
give_payout(balance)
|
||||
balance = 0
|
||||
|
||||
/obj/machinery/computer/slot_machine/emp_act(severity)
|
||||
. = ..()
|
||||
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(prob(1500 / severity))
|
||||
if(prob(15 * severity))
|
||||
return
|
||||
if(prob(1 * severity/100)) // :^)
|
||||
if(prob(1)) // :^)
|
||||
obj_flags |= EMAGGED
|
||||
var/severity_ascending = 4 - severity
|
||||
money = max(rand(money - (200 * severity_ascending), money + (200 * severity_ascending)), 0)
|
||||
balance = max(rand(balance - (50 * severity_ascending), balance + (50 * severity_ascending)), 0)
|
||||
money -= max(0, give_coins(min(rand(-50, 100 * severity_ascending)), money)) //This starts at -50 because it shouldn't always dispense coins yo
|
||||
money -= max(0, give_payout(min(rand(-50, 100 * severity_ascending)), money)) //This starts at -50 because it shouldn't always dispense coins yo
|
||||
spin()
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/spin(mob/user)
|
||||
@@ -174,37 +204,43 @@
|
||||
balance -= SPIN_PRICE
|
||||
money += SPIN_PRICE
|
||||
plays += 1
|
||||
working = 1
|
||||
working = TRUE
|
||||
|
||||
toggle_reel_spin(1)
|
||||
update_icon()
|
||||
updateDialog()
|
||||
|
||||
spawn(0)
|
||||
while(working)
|
||||
randomize_reels()
|
||||
updateDialog()
|
||||
sleep(2)
|
||||
var/spin_loop = addtimer(CALLBACK(src, .proc/do_spin), 2, TIMER_LOOP|TIMER_STOPPABLE)
|
||||
|
||||
spawn(SPIN_TIME - (REEL_DEACTIVATE_DELAY * reels.len)) //WARNING: no sanity checking for user since it's not needed and would complicate things (machine should still spin even if user is gone), be wary of this if you're changing this code.
|
||||
toggle_reel_spin(0, REEL_DEACTIVATE_DELAY)
|
||||
working = 0
|
||||
give_prizes(the_name, user)
|
||||
update_icon()
|
||||
updateDialog()
|
||||
addtimer(CALLBACK(src, .proc/finish_spinning, spin_loop, user, the_name), SPIN_TIME - (REEL_DEACTIVATE_DELAY * reels.len))
|
||||
//WARNING: no sanity checking for user since it's not needed and would complicate things (machine should still spin even if user is gone), be wary of this if you're changing this code.
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/do_spin()
|
||||
randomize_reels()
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/finish_spinning(spin_loop, mob/user, the_name)
|
||||
toggle_reel_spin(0, REEL_DEACTIVATE_DELAY)
|
||||
working = FALSE
|
||||
deltimer(spin_loop)
|
||||
give_prizes(the_name, user)
|
||||
update_icon()
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/can_spin(mob/user)
|
||||
if(stat & NOPOWER)
|
||||
to_chat(user, "<span class='warning'>The slot machine has no power!</span>")
|
||||
return FALSE
|
||||
if(stat & BROKEN)
|
||||
to_chat(user, "<span class='warning'>The slot machine is broken!</span>")
|
||||
return FALSE
|
||||
if(working)
|
||||
to_chat(user, "<span class='warning'>You need to wait until the machine stops spinning before you can play again!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(balance < SPIN_PRICE)
|
||||
to_chat(user, "<span class='warning'>Insufficient money to play!</span>")
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/toggle_reel_spin(value, delay = 0) //value is 1 or 0 aka on or off
|
||||
for(var/list/reel in reels)
|
||||
@@ -223,23 +259,25 @@
|
||||
var/linelength = get_lines()
|
||||
|
||||
if(reels[1][2] + reels[2][2] + reels[3][2] + reels[4][2] + reels[5][2] == "[SEVEN][SEVEN][SEVEN][SEVEN][SEVEN]")
|
||||
visible_message("<b>[src]</b> says, 'JACKPOT! You win [money] credits worth of coins!'")
|
||||
visible_message("<b>[src]</b> says, 'JACKPOT! You win [money] credits!'")
|
||||
priority_announce("Congratulations to [user ? user.real_name : usrname] for winning the jackpot at the slot machine in [get_area(src)]!")
|
||||
jackpots += 1
|
||||
balance += money - give_coins(JACKPOT)
|
||||
balance += money - give_payout(JACKPOT)
|
||||
money = 0
|
||||
|
||||
for(var/i = 0, i < 5, i++)
|
||||
var/cointype = pick(subtypesof(/obj/item/coin))
|
||||
var/obj/item/coin/C = new cointype(loc)
|
||||
random_step(C, 2, 50)
|
||||
if(paymode == HOLOCHIP)
|
||||
new /obj/item/holochip(loc,JACKPOT)
|
||||
else
|
||||
for(var/i = 0, i < 5, i++)
|
||||
cointype = pick(subtypesof(/obj/item/coin))
|
||||
var/obj/item/coin/C = new cointype(loc)
|
||||
random_step(C, 2, 50)
|
||||
|
||||
else if(linelength == 5)
|
||||
visible_message("<b>[src]</b> says, 'Big Winner! You win a thousand credits worth of coins!'")
|
||||
visible_message("<b>[src]</b> says, 'Big Winner! You win a thousand credits!'")
|
||||
give_money(BIG_PRIZE)
|
||||
|
||||
else if(linelength == 4)
|
||||
visible_message("<b>[src]</b> says, 'Winner! You win four hundred credits worth of coins!'")
|
||||
visible_message("<b>[src]</b> says, 'Winner! You win four hundred credits!'")
|
||||
give_money(SMALL_PRIZE)
|
||||
|
||||
else if(linelength == 3)
|
||||
@@ -271,12 +309,15 @@
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/give_money(amount)
|
||||
var/amount_to_give = money >= amount ? amount : money
|
||||
var/surplus = amount_to_give - give_coins(amount_to_give)
|
||||
var/surplus = amount_to_give - give_payout(amount_to_give)
|
||||
money = max(0, money - amount)
|
||||
balance += surplus
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/give_coins(amount)
|
||||
var/cointype = obj_flags & EMAGGED ? /obj/item/coin/iron : /obj/item/coin/silver
|
||||
/obj/machinery/computer/slot_machine/proc/give_payout(amount)
|
||||
if(paymode == HOLOCHIP)
|
||||
cointype = /obj/item/holochip
|
||||
else
|
||||
cointype = obj_flags & EMAGGED ? /obj/item/coin/iron : /obj/item/coin/silver
|
||||
|
||||
if(!(obj_flags & EMAGGED))
|
||||
amount = dispense(amount, cointype, null, 0)
|
||||
@@ -288,22 +329,25 @@
|
||||
|
||||
return amount
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/coin/silver, mob/living/target, throwit = FALSE)
|
||||
var/value = GLOB.coin_values[cointype] || GLOB.coin_values[/obj/item/coin/iron]
|
||||
INVOKE_ASYNC(src, .proc/become_rich, amount, value, cointype, target, throwit)
|
||||
return amount % value
|
||||
/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/coin/silver, mob/living/target, throwit = 0)
|
||||
if(paymode == HOLOCHIP)
|
||||
var/obj/item/holochip/H = new /obj/item/holochip(loc,amount)
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/become_rich(amount, value, cointype = /obj/item/coin/silver, mob/living/target, throwit = FALSE)
|
||||
if(value <= 0)
|
||||
return
|
||||
while(amount >= value && !QDELETED(src))
|
||||
var/obj/item/coin/C = new cointype(loc) //DOUBLE THE PAIN
|
||||
amount -= value
|
||||
if(throwit && target)
|
||||
C.throw_at(target, 3, 10)
|
||||
else
|
||||
random_step(C, 2, 40)
|
||||
CHECK_TICK
|
||||
H.throw_at(target, 3, 10)
|
||||
else
|
||||
var/value = coinvalues["[cointype]"]
|
||||
if(value <= 0)
|
||||
CRASH("Coin value of zero, refusing to payout in dispenser")
|
||||
while(amount >= value)
|
||||
var/obj/item/coin/C = new cointype(loc) //DOUBLE THE PAIN
|
||||
amount -= value
|
||||
if(throwit && target)
|
||||
C.throw_at(target, 3, 10)
|
||||
else
|
||||
random_step(C, 2, 40)
|
||||
|
||||
return amount
|
||||
|
||||
#undef SEVEN
|
||||
#undef SPIN_TIME
|
||||
@@ -311,3 +355,5 @@
|
||||
#undef BIG_PRIZE
|
||||
#undef SMALL_PRIZE
|
||||
#undef SPIN_PRICE
|
||||
#undef HOLOCHIP
|
||||
#undef COIN
|
||||
|
||||
Reference in New Issue
Block a user