diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index b2af98e1b5a..7277bc6a366 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -6,41 +6,7 @@
icon_keyboard = null
icon_screen = "invaders"
light_color = "#00FF00"
-
- var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
- /obj/item/toy/AI = 2,
- /obj/item/clothing/under/syndicate/tacticool = 2,
- /obj/item/toy/blink = 2,
- /obj/item/weapon/storage/box/fakesyndiesuit = 2,
- /obj/item/toy/sword = 2,
- /obj/item/weapon/gun/projectile/revolver/capgun = 2,
- /obj/item/toy/crossbow = 2,
- /obj/item/weapon/storage/fancy/crayons = 2,
- /obj/item/toy/spinningtoy = 2,
- /obj/item/toy/crossbow/tommygun = 2,
- /obj/random/prize = 5,
- /obj/item/toy/nuke = 2,
- /obj/item/toy/cards/deck = 2,
- /obj/random/carp_plushie = 2,
- /obj/item/toy/minimeteor = 2,
- /obj/item/toy/redbutton = 2,
- /obj/item/toy/owl = 2,
- /obj/item/toy/griffin = 2,
- /obj/item/clothing/head/blob = 2,
- /obj/item/weapon/id_decal/gold = 2,
- /obj/item/weapon/id_decal/silver = 2,
- /obj/item/weapon/id_decal/prisoner = 2,
- /obj/item/weapon/id_decal/centcom = 2,
- /obj/item/weapon/id_decal/emag = 2,
- /obj/item/weapon/spellbook/oneuse/fake_gib = 2,
- /obj/item/toy/foamblade = 2,
- /obj/item/toy/flash = 2,
- /obj/item/toy/minigibber = 2,
- /obj/item/toy/toy_xeno = 2,
- /obj/random/figure = 16,
- /obj/random/plushie = 7,
- /obj/item/stack/tile/fakespace/loaded = 2,
- )
+ var/prize = /obj/item/stack/tickets
/obj/machinery/computer/arcade/power_change()
..()
@@ -56,28 +22,22 @@
qdel(src)
-/obj/machinery/computer/arcade/proc/prizevend()
+/obj/machinery/computer/arcade/proc/prizevend(var/score)
if(!contents.len)
- var/prizeselect = pickweight(prizes)
- new prizeselect(src.loc)
-
- if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
- new /obj/item/ammo_box/caps(src.loc)
-
- else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
- new /obj/item/clothing/head/syndicatefake(src.loc)
-
+ var/prize_amount
+ if(score)
+ prize_amount = score
+ else
+ prize_amount = rand(1, 10)
+ new prize(get_turf(src), prize_amount)
else
var/atom/movable/prize = pick(contents)
- prize.loc = src.loc
+ prize.loc = get_turf(src)
/obj/machinery/computer/arcade/emp_act(severity)
..(severity)
-
if(stat & (NOPOWER|BROKEN))
return
-
- var/empprize = null
var/num_of_prizes = 0
switch(severity)
if(1)
@@ -85,9 +45,8 @@
if(2)
num_of_prizes = rand(0,2)
for(var/i = num_of_prizes; i > 0; i--)
- empprize = pickweight(prizes)
- new empprize(src.loc)
- explosion(src.loc, -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes)
+ prizevend()
+ explosion(get_turf(src), -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes)
/obj/machinery/computer/arcade/battle
@@ -116,20 +75,20 @@
name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers")
- src.enemy_name = replacetext((name_part1 + name_part2), "the ", "")
- src.name = (name_action + name_part1 + name_part2)
+ enemy_name = replacetext((name_part1 + name_part2), "the ", "")
+ name = (name_action + name_part1 + name_part2)
/obj/machinery/computer/arcade/battle/attack_hand(mob/user as mob)
if(..())
return
user.set_machine(src)
var/dat = "Close"
- dat += "
[src.enemy_name]
"
+ dat += "[enemy_name]
"
- dat += "
[src.temp]
"
- dat += "
Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]"
+ dat += "
[temp]
"
+ dat += "
Health: [player_hp] | Magic: [player_mp] | Enemy Health: [enemy_hp]"
- if (src.gameover)
+ if (gameover)
dat += "New Game"
else
dat += "Attack | "
@@ -142,7 +101,7 @@
//onclose(user, "arcade")
var/datum/browser/popup = new(user, "arcade", "Space Villian 2000")
popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
return
@@ -150,48 +109,48 @@
if(..())
return
- if (!src.blocked && !src.gameover)
+ if (!blocked && !gameover)
if (href_list["attack"])
- src.blocked = 1
+ blocked = 1
var/attackamt = rand(2,6)
- src.temp = "You attack for [attackamt] damage!"
+ temp = "You attack for [attackamt] damage!"
playsound(src.loc, 'sound/arcade/Hit.ogg', 20, 1, extrarange = -6, falloff = 10)
- src.updateUsrDialog()
+ updateUsrDialog()
if(turtle > 0)
turtle--
sleep(10)
- src.enemy_hp -= attackamt
- src.arcade_action()
+ enemy_hp -= attackamt
+ arcade_action()
else if (href_list["heal"])
- src.blocked = 1
+ blocked = 1
var/pointamt = rand(1,3)
var/healamt = rand(6,8)
- src.temp = "You use [pointamt] magic to heal for [healamt] damage!"
+ temp = "You use [pointamt] magic to heal for [healamt] damage!"
playsound(src.loc, 'sound/arcade/Heal.ogg', 20, 1, extrarange = -6, falloff = 10)
- src.updateUsrDialog()
+ updateUsrDialog()
turtle++
sleep(10)
- src.player_mp -= pointamt
- src.player_hp += healamt
- src.blocked = 1
- src.updateUsrDialog()
- src.arcade_action()
+ player_mp -= pointamt
+ player_hp += healamt
+ blocked = 1
+ updateUsrDialog()
+ arcade_action()
else if (href_list["charge"])
- src.blocked = 1
+ blocked = 1
var/chargeamt = rand(4,7)
- src.temp = "You regain [chargeamt] points"
+ temp = "You regain [chargeamt] points"
playsound(src.loc, 'sound/arcade/Mana.ogg', 20, 1, extrarange = -6, falloff = 10)
- src.player_mp += chargeamt
+ player_mp += chargeamt
if(turtle > 0)
turtle--
- src.updateUsrDialog()
+ updateUsrDialog()
sleep(10)
- src.arcade_action()
+ arcade_action()
if (href_list["close"])
usr.unset_machine()
@@ -207,49 +166,50 @@
turtle = 0
if(emagged)
- src.New()
+ New()
emagged = 0
- src.add_fingerprint(usr)
- src.updateUsrDialog()
+ add_fingerprint(usr)
+ updateUsrDialog()
return
/obj/machinery/computer/arcade/battle/proc/arcade_action()
- if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0))
+ if ((enemy_mp <= 0) || (enemy_hp <= 0))
if(!gameover)
- src.gameover = 1
- src.temp = "[src.enemy_name] has fallen! Rejoice!"
+ gameover = 1
+ temp = "[enemy_name] has fallen! Rejoice!"
playsound(src.loc, 'sound/arcade/Win.ogg', 20, 1, extrarange = -6, falloff = 10)
if(emagged)
feedback_inc("arcade_win_emagged")
- new /obj/effect/spawner/newbomb/timer/syndicate(src.loc)
- new /obj/item/clothing/head/collectable/petehat(src.loc)
+ new /obj/effect/spawner/newbomb/timer/syndicate(get_turf(src))
+ new /obj/item/clothing/head/collectable/petehat(get_turf(src))
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.")
- src.New()
+ New()
emagged = 0
else
feedback_inc("arcade_win_normal")
- prizevend()
+ var/score = player_hp + player_mp + 5
+ prizevend(score)
else if (emagged && (turtle >= 4))
var/boomamt = rand(5,10)
- src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!"
+ temp = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!"
playsound(src.loc, 'sound/arcade/Boom.ogg', 20, 1, extrarange = -6, falloff = 10)
- src.player_hp -= boomamt
+ player_hp -= boomamt
- else if ((src.enemy_mp <= 5) && (prob(70)))
+ else if ((enemy_mp <= 5) && (prob(70)))
var/stealamt = rand(2,3)
- src.temp = "[src.enemy_name] steals [stealamt] of your power!"
+ temp = "[enemy_name] steals [stealamt] of your power!"
playsound(src.loc, 'sound/arcade/Steal.ogg', 20, 1, extrarange = -6, falloff = 10)
- src.player_mp -= stealamt
- src.updateUsrDialog()
+ player_mp -= stealamt
+ updateUsrDialog()
- if (src.player_mp <= 0)
- src.gameover = 1
+ if (player_mp <= 0)
+ gameover = 1
sleep(10)
- src.temp = "You have been drained! GAME OVER"
+ temp = "You have been drained! GAME OVER"
playsound(src.loc, 'sound/arcade/Lose.ogg', 20, 1, extrarange = -6, falloff = 10)
if(emagged)
feedback_inc("arcade_loss_mana_emagged")
@@ -257,21 +217,21 @@
else
feedback_inc("arcade_loss_mana_normal")
- else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4))
- src.temp = "[src.enemy_name] heals for 4 health!"
+ else if ((enemy_hp <= 10) && (enemy_mp > 4))
+ temp = "[enemy_name] heals for 4 health!"
playsound(src.loc, 'sound/arcade/Heal.ogg', 20, 1, extrarange = -6, falloff = 10)
- src.enemy_hp += 4
- src.enemy_mp -= 4
+ enemy_hp += 4
+ enemy_mp -= 4
else
var/attackamt = rand(3,6)
- src.temp = "[src.enemy_name] attacks for [attackamt] damage!"
+ temp = "[enemy_name] attacks for [attackamt] damage!"
playsound(src.loc, 'sound/arcade/Hit.ogg', 20, 1, extrarange = -6, falloff = 10)
- src.player_hp -= attackamt
+ player_hp -= attackamt
- if ((src.player_mp <= 0) || (src.player_hp <= 0))
- src.gameover = 1
- src.temp = "You have been crushed! GAME OVER"
+ if ((player_mp <= 0) || (player_hp <= 0))
+ gameover = 1
+ temp = "You have been crushed! GAME OVER"
playsound(src.loc, 'sound/arcade/Lose.ogg', 20, 1, extrarange = -6, falloff = 10)
if(emagged)
feedback_inc("arcade_loss_hp_emagged")
@@ -279,7 +239,7 @@
else
feedback_inc("arcade_loss_hp_normal")
- src.blocked = 0
+ blocked = 0
return
@@ -298,7 +258,7 @@
enemy_name = "Cuban Pete"
name = "Outbomb Cuban Pete"
- src.updateUsrDialog()
+ updateUsrDialog()
// *** THE ORION TRAIL ** //
@@ -450,7 +410,7 @@
dat += "Close
"
var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700)
popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
return
@@ -537,7 +497,7 @@
playsound(src.loc, 'sound/effects/bang.ogg', 20, 1)
if(ORION_TRAIL_MALFUNCTION)
playsound(src.loc, 'sound/effects/EMPulse.ogg', 20, 1)
- src.visible_message("[src] malfunctions, randomizing in-game stats!")
+ visible_message("[src] malfunctions, randomizing in-game stats!")
var/oldfood = food
var/oldfuel = fuel
food = rand(10,80) / rand(1,2)
@@ -545,9 +505,9 @@
if(electronics)
sleep(10)
if(oldfuel > fuel && oldfood > food)
- src.audible_message("[src] lets out a somehow reassuring chime.")
+ audible_message("[src] lets out a somehow reassuring chime.")
else if(oldfuel < fuel || oldfood < food)
- src.audible_message("[src] lets out a somehow ominous chime.")
+ audible_message("[src] lets out a somehow ominous chime.")
food = oldfood
fuel = oldfuel
playsound(src.loc, 'sound/machines/chime.ogg', 20, 1)
@@ -709,8 +669,8 @@
last_spaceport_action = "Traded Food for Fuel"
event()
- src.add_fingerprint(usr)
- src.updateUsrDialog()
+ add_fingerprint(usr)
+ updateUsrDialog()
busy = 0
return
@@ -984,11 +944,12 @@
turns = 1
atom_say("Congratulations, you made it to Orion!")
if(emagged)
- new /obj/item/weapon/orion_ship(src.loc)
+ new /obj/item/weapon/orion_ship(get_turf(src))
message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
else
- prizevend()
+ var/score = alive + round(food/2) + round(fuel/5) + engine + hull + electronics - lings_aboard
+ prizevend(score)
emagged = 0
name = "The Orion Trail"
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
@@ -1047,17 +1008,17 @@
user << "You flip the switch on the underside of [src]."
active = 1
- src.visible_message("[src] softly beeps and whirs to life!")
+ visible_message("[src] softly beeps and whirs to life!")
playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1)
atom_say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.")
sleep(20)
- src.visible_message("[src] begins to vibrate...")
+ visible_message("[src] begins to vibrate...")
atom_say("Uh, Port? Having some issues with our reactor, could you check it out? Over.")
sleep(30)
atom_say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-")
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 25, 1)
sleep(3.6)
- src.visible_message("[src] explodes!")
+ visible_message("[src] explodes!")
explosion(src.loc, 1,2,4, flame_range = 3)
qdel(src)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index f4c6cc90c57..c62c8131f25 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -844,7 +844,18 @@ obj/item/weapon/circuitboard/rdserver
board_type = "machine"
origin_tech = "programming=2"
req_components = list(
- /obj/item/weapon/stock_parts.matter_bin = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/stack/cable_coil = 5,
- /obj/item/stack/sheet/glass = 1)
\ No newline at end of file
+ /obj/item/stack/sheet/glass = 1)
+
+/obj/item/weapon/circuitboard/prize_counter
+ name = "circuit board (Prize Counter)"
+ build_path = /obj/machinery/prize_counter
+ board_type = "machine"
+ origin_tech = "programming=2;materials=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/cable_coil = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 6a3493fc0ea..45d15625e06 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -51,9 +51,9 @@
if(!proximity) return
if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1)
A.reagents.trans_to(src, 10)
- user << "\blue You fill the balloon with the contents of [A]."
- src.desc = "A translucent balloon with some form of liquid sloshing around in it."
- src.update_icon()
+ user << "You fill the balloon with the contents of [A]."
+ desc = "A translucent balloon with some form of liquid sloshing around in it."
+ update_icon()
return
/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob, params)
@@ -67,19 +67,19 @@
O.reagents.reaction(user)
qdel(src)
else
- src.desc = "A translucent balloon with some form of liquid sloshing around in it."
- user << "\blue You fill the balloon with the contents of [O]."
+ desc = "A translucent balloon with some form of liquid sloshing around in it."
+ user << "You fill the balloon with the contents of [O]."
O.reagents.trans_to(src, 10)
- src.update_icon()
+ update_icon()
return
/obj/item/toy/balloon/throw_impact(atom/hit_atom)
- if(src.reagents.total_volume >= 1)
- src.visible_message("\red The [src] bursts!","You hear a pop and a splash.")
- src.reagents.reaction(get_turf(hit_atom))
+ if(reagents.total_volume >= 1)
+ visible_message("The [src] bursts!","You hear a pop and a splash.")
+ reagents.reaction(get_turf(hit_atom))
for(var/atom/A in get_turf(hit_atom))
- src.reagents.reaction(A)
- src.icon_state = "burst"
+ reagents.reaction(A)
+ icon_state = "burst"
spawn(5)
if(src)
qdel(src)
@@ -141,89 +141,84 @@
attack_verb = list("attacked", "struck", "hit")
var/bullets = 5
- examine(mob/user)
- ..(user)
- if (bullets)
- user << "\blue It is loaded with [bullets] foam darts!"
+/obj/item/toy/crossbow/examine(mob/user)
+ ..(user)
+ if (bullets)
+ user << "It is loaded with [bullets] foam darts!"
- attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/toy/ammo/crossbow))
- if(bullets <= 4)
- user.drop_item()
- qdel(I)
- bullets++
- user << "\blue You load the foam dart into the crossbow."
- else
- usr << "\red It's already fully loaded."
+/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob, params)
+ if(istype(I, /obj/item/toy/ammo/crossbow))
+ if(bullets <= 4)
+ user.drop_item()
+ qdel(I)
+ bullets++
+ user << "You load the foam dart into the crossbow."
+ else
+ usr << "It's already fully loaded."
- afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if(!isturf(target.loc) || target == user) return
- if(flag) return
+/obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
+ if(!isturf(target.loc) || target == user) return
+ if(flag) return
- if (locate (/obj/structure/table, src.loc))
- return
- else if (bullets)
- var/turf/trg = get_turf(target)
- var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src))
- bullets--
- D.icon_state = "foamdart"
- D.name = "foam dart"
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
+ if (locate (/obj/structure/table, src.loc))
+ return
+ else if (bullets)
+ var/turf/trg = get_turf(target)
+ var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src))
+ bullets--
+ D.icon_state = "foamdart"
+ D.name = "foam dart"
+ playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
- for(var/i=0, i<6, i++)
- if (D)
- if(D.loc == trg) break
- step_towards(D,trg)
+ for(var/i=0, i<6, i++)
+ if (D)
+ if(D.loc == trg) break
+ step_towards(D,trg)
- for(var/mob/living/M in D.loc)
- if(!istype(M,/mob/living)) continue
- if(M == user) continue
- D.visible_message("[M] was hit by the foam dart!")
- new /obj/item/toy/ammo/crossbow(M.loc)
- qdel(D)
- return
-
- for(var/atom/A in D.loc)
- if(A == user) continue
- if(A.density)
- new /obj/item/toy/ammo/crossbow(A.loc)
- qdel(D)
-
- sleep(1)
-
- spawn(10)
- if(D)
- new /obj/item/toy/ammo/crossbow(D.loc)
+ for(var/mob/living/M in D.loc)
+ if(!istype(M,/mob/living)) continue
+ if(M == user) continue
+ D.visible_message("[M] was hit by the foam dart!")
+ new /obj/item/toy/ammo/crossbow(M.loc)
qdel(D)
+ return
- return
- else if (bullets == 0)
- user.Weaken(5)
- user.visible_message("[] realized they were out of ammo and starting scrounging for some!")
+ for(var/atom/A in D.loc)
+ if(A == user) continue
+ if(A.density)
+ new /obj/item/toy/ammo/crossbow(A.loc)
+ qdel(D)
+
+ sleep(1)
+
+ spawn(10)
+ if(D)
+ new /obj/item/toy/ammo/crossbow(D.loc)
+ qdel(D)
+
+ return
+ else if (bullets == 0)
+ user.Weaken(5)
+ user.visible_message("[] realized they were out of ammo and starting scrounging for some!")
- attack(mob/M as mob, mob/user as mob)
- src.add_fingerprint(user)
+/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob)
+ add_fingerprint(user)
// ******* Check
- if (src.bullets > 0 && M.lying)
-
- for(var/mob/O in viewers(M, null))
- if(O.client)
- O.show_message(text("[] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull.", 2)
- O.show_message(text("\red [] was hit in the head by the foam dart!", M), 1)
-
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
- new /obj/item/toy/ammo/crossbow(M.loc)
- src.bullets--
- else if (M.lying && src.bullets == 0)
- for(var/mob/O in viewers(M, null))
- if (O.client) O.show_message(text("[] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "You hear someone fall.", 2)
- user.Weaken(5)
- return
+ if (bullets > 0 && M.lying)
+ visible_message("[user] casually lines up a shot with [M]'s head and pulls the trigger!", "You hear the sound of foam against skull.")
+ M.visible_message("[M] was hit in the head by the foam dart!")
+ playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
+ new /obj/item/toy/ammo/crossbow(M.loc)
+ bullets--
+ else if (M.lying && bullets == 0)
+ visible_message("[user] casually lines up a shot with [M]'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", "You hear someone fall.")
+ user.Weaken(5)
+ return
/obj/item/toy/ammo/crossbow
name = "foam dart"
@@ -279,27 +274,27 @@
flags = NOSHIELD
attack_verb = list("attacked", "struck", "hit")
- attack_self(mob/user as mob)
- src.active = !( src.active )
- if (src.active)
- user << "\blue You extend the plastic blade with a quick flick of your wrist."
- playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
- src.icon_state = "swordblue"
- src.item_state = "swordblue"
- src.w_class = 4
- else
- user << "\blue You push the plastic blade back down into the handle."
- playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
- src.icon_state = "sword0"
- src.item_state = "sword0"
- src.w_class = 2
+/obj/item/toy/sword/attack_self(mob/user as mob)
+ active = !(active)
+ if (active)
+ user << "You extend the plastic blade with a quick flick of your wrist."
+ playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
+ icon_state = "swordblue"
+ item_state = "swordblue"
+ w_class = 4
+ else
+ user << "You push the plastic blade back down into the handle."
+ playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
+ icon_state = "sword0"
+ item_state = "sword0"
+ w_class = 2
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- H.update_inv_l_hand()
- H.update_inv_r_hand()
- src.add_fingerprint(user)
- return
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+ add_fingerprint(user)
+ return
// Copied from /obj/item/weapon/melee/energy/sword/attackby
/obj/item/toy/sword/attackby(obj/item/weapon/W, mob/living/user, params)
@@ -374,21 +369,15 @@
w_class = 1
- throw_impact(atom/hit_atom)
- ..()
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message("\red The [src.name] explodes!","\red You hear a bang!")
-
-
- playsound(src, 'sound/effects/snap.ogg', 50, 1)
- qdel(src)
-
-
-
-
+/obj/item/toy/snappop/virus/throw_impact(atom/hit_atom)
+ ..()
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ new /obj/effect/decal/cleanable/ash(src.loc)
+ visible_message("The [name] explodes!","You hear a bang!")
+ playsound(src, 'sound/effects/snap.ogg', 50, 1)
+ qdel(src)
/*
* Snap pops
@@ -400,27 +389,27 @@
icon_state = "snappop"
w_class = 1
- throw_impact(atom/hit_atom)
- ..()
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message("\red The [src.name] explodes!","\red You hear a snap!")
- playsound(src, 'sound/effects/snap.ogg', 50, 1)
- qdel(src)
+/obj/item/toy/snappop/throw_impact(atom/hit_atom)
+ ..()
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ new /obj/effect/decal/cleanable/ash(src.loc)
+ visible_message("The [src.name] explodes!","You hear a snap!")
+ playsound(src, 'sound/effects/snap.ogg', 50, 1)
+ qdel(src)
/obj/item/toy/snappop/Crossed(H as mob|obj)
if((ishuman(H))) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
if(M.m_intent == "run")
- M << "\red You step on the snap pop!"
+ M << "You step on the snap pop!"
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(2, 0, src)
s.start()
new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message("\red The [src.name] explodes!","\red You hear a snap!")
+ visible_message("The [name] explodes!","You hear a snap!")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
@@ -450,13 +439,13 @@
return
..()
-/obj/random/prize
+/obj/random/mech
name = "Random Mech Prize"
desc = "This is a random prize"
icon = 'icons/obj/toy.dmi'
icon_state = "ripleytoy"
-/obj/random/prize/item_to_spawn()
+/obj/random/mech/item_to_spawn()
return pick(subtypesof(/obj/item/toy/prize)) //exclude the base type.
/obj/item/toy/prize/ripley
@@ -591,7 +580,7 @@ obj/item/toy/cards/deck/New()
obj/item/toy/cards/deck/attack_hand(mob/user as mob)
var/choice = null
if(cards.len == 0)
- src.icon_state = "deck_[deckstyle]_empty"
+ icon_state = "deck_[deckstyle]_empty"
user << "There are no more cards to draw."
return
var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc)
@@ -600,16 +589,16 @@ obj/item/toy/cards/deck/attack_hand(mob/user as mob)
H.parentdeck = src
var/O = src
H.apply_card_vars(H,O)
- src.cards -= choice
+ cards -= choice
H.pickup(user)
user.put_in_active_hand(H)
- src.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.")
+ visible_message("[user] draws a card from the deck.", "You draw a card from the deck.")
if(cards.len > 26)
- src.icon_state = "deck_[deckstyle]_full"
+ icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
- src.icon_state = "deck_[deckstyle]_half"
+ icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
- src.icon_state = "deck_[deckstyle]_low"
+ icon_state = "deck_[deckstyle]_low"
obj/item/toy/cards/deck/attack_self(mob/user as mob)
if(cooldown < world.time - 50)
@@ -625,17 +614,17 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use
if(!user.unEquip(C))
user << "The card is stuck to your hand, you can't add it to the deck!"
return
- src.cards += C.cardname
+ cards += C.cardname
user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.")
qdel(C)
else
user << "You can't mix cards from other decks."
if(cards.len > 26)
- src.icon_state = "deck_[deckstyle]_full"
+ icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
- src.icon_state = "deck_[deckstyle]_half"
+ icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
- src.icon_state = "deck_[deckstyle]_low"
+ icon_state = "deck_[deckstyle]_low"
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, params)
@@ -645,17 +634,17 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user,
if(!user.unEquip(C))
user << "The hand of cards is stuck to your hand, you can't add it to the deck!"
return
- src.cards += C.currenthand
+ cards += C.currenthand
user.visible_message("[user] puts their hand of cards in the deck.", "You put the hand of cards in the deck.")
qdel(C)
else
user << "You can't mix cards from other decks."
if(cards.len > 26)
- src.icon_state = "deck_[deckstyle]_full"
+ icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
- src.icon_state = "deck_[deckstyle]_half"
+ icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
- src.icon_state = "deck_[deckstyle]_low"
+ icon_state = "deck_[deckstyle]_low"
obj/item/toy/cards/deck/MouseDrop(atom/over_object)
var/mob/M = usr
@@ -718,7 +707,7 @@ obj/item/toy/cards/cardhand/Topic(href, href_list)
if (cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
var/choice = href_list["pick"]
var/obj/item/toy/cards/singlecard/C = new/obj/item/toy/cards/singlecard(cardUser.loc)
- src.currenthand -= choice
+ currenthand -= choice
C.parentdeck = src.parentdeck
C.cardname = choice
C.apply_card_vars(C,O)
@@ -727,13 +716,13 @@ obj/item/toy/cards/cardhand/Topic(href, href_list)
cardUser.visible_message("[cardUser] draws a card from \his hand.", "You take the [C.cardname] from your hand.")
interact(cardUser)
- if(src.currenthand.len < 3)
- src.icon_state = "[deckstyle]_hand2"
+ if(currenthand.len < 3)
+ icon_state = "[deckstyle]_hand2"
else if(src.currenthand.len < 4)
- src.icon_state = "[deckstyle]_hand3"
+ icon_state = "[deckstyle]_hand3"
else if(src.currenthand.len < 5)
- src.icon_state = "[deckstyle]_hand4"
- if(src.currenthand.len == 1)
+ icon_state = "[deckstyle]_hand4"
+ if(currenthand.len == 1)
var/obj/item/toy/cards/singlecard/N = new/obj/item/toy/cards/singlecard(src.loc)
N.parentdeck = src.parentdeck
N.cardname = src.currenthand[1]
@@ -748,17 +737,17 @@ obj/item/toy/cards/cardhand/Topic(href, href_list)
obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living/user, params)
if(istype(C))
- if(C.parentdeck == src.parentdeck)
- src.currenthand += C.cardname
+ if(C.parentdeck == parentdeck)
+ currenthand += C.cardname
user.unEquip(C)
user.visible_message("[user] adds a card to their hand.", "You add the [C.cardname] to your hand.")
interact(user)
if(currenthand.len > 4)
- src.icon_state = "[deckstyle]_hand5"
+ icon_state = "[deckstyle]_hand5"
else if(currenthand.len > 3)
- src.icon_state = "[deckstyle]_hand4"
+ icon_state = "[deckstyle]_hand4"
else if(currenthand.len > 2)
- src.icon_state = "[deckstyle]_hand3"
+ icon_state = "[deckstyle]_hand3"
qdel(C)
else
user << "You can't mix cards from other decks."
@@ -803,33 +792,33 @@ obj/item/toy/cards/singlecard/verb/Flip()
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
return
if(!flipped)
- src.flipped = 1
+ flipped = 1
if (cardname)
- src.icon_state = "sc_[cardname]_[deckstyle]"
- src.name = src.cardname
+ icon_state = "sc_[cardname]_[deckstyle]"
+ name = cardname
else
- src.icon_state = "sc_Ace of Spades_[deckstyle]"
- src.name = "What Card"
- src.pixel_x = 5
+ icon_state = "sc_Ace of Spades_[deckstyle]"
+ name = "What Card"
+ pixel_x = 5
else if(flipped)
- src.flipped = 0
- src.icon_state = "singlecard_down_[deckstyle]"
- src.name = "card"
- src.pixel_x = -5
+ flipped = 0
+ icon_state = "singlecard_down_[deckstyle]"
+ name = "card"
+ pixel_x = -5
obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/toy/cards/singlecard/))
var/obj/item/toy/cards/singlecard/C = I
- if(C.parentdeck == src.parentdeck)
+ if(C.parentdeck == parentdeck)
var/obj/item/toy/cards/cardhand/H = new/obj/item/toy/cards/cardhand(user.loc)
H.currenthand += C.cardname
- H.currenthand += src.cardname
+ H.currenthand += cardname
H.parentdeck = C.parentdeck
H.apply_card_vars(H,C)
user.unEquip(C)
H.pickup(user)
user.put_in_active_hand(H)
- user << "You combine the [C.cardname] and the [src.cardname] into a hand."
+ user << "You combine the [C.cardname] and the [cardname] into a hand."
qdel(C)
qdel(src)
else
@@ -923,54 +912,58 @@ obj/item/toy/cards/deck/syndicate/black
var/timeleft = (cooldown - world.time)
user << "Nothing happens, and '[round(timeleft/10)]' appears on a small display."
-
-/obj/item/toy/therapy_red
- name = "red therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is red."
- icon = 'icons/obj/weapons.dmi'
+/obj/item/toy/therapy
+ name = "therapy doll"
+ desc = "A toy for therapeutic and recreational purposes."
icon_state = "therapyred"
+ item_state = "egg4"
+ w_class = 1
+ var/cooldown = 0
+
+/obj/item/toy/therapy/New()
+ if(item_color)
+ name = "[item_color] therapy doll"
+ desc += " This one is [item_color]."
+ icon_state = "therapy[item_color]"
+
+/obj/item/toy/therapy/attack_self(mob/user)
+ if(cooldown < world.time - 8)
+ user << "You relieve some stress with \the [src]."
+ playsound(user, 'sound/items/squeaktoy.ogg', 20, 1)
+ cooldown = world.time
+
+/obj/random/therapy
+ name = "Random Therapy Doll"
+ desc = "This is a random therapy doll."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "therapyred"
+
+/obj/random/prize/item_to_spawn()
+ return pick(subtypesof(/obj/item/toy/therapy)) //exclude the base type.
+
+/obj/item/toy/therapy/red
item_state = "egg4" // It's the red egg in items_left/righthand
- w_class = 1
+ item_color = "red"
-/obj/item/toy/therapy_purple
- name = "purple therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is purple."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapypurple"
+/obj/item/toy/therapy/purple
item_state = "egg1" // It's the magenta egg in items_left/righthand
- w_class = 1
+ item_color = "purple"
-/obj/item/toy/therapy_blue
- name = "blue therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is blue."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapyblue"
+/obj/item/toy/therapy/blue
item_state = "egg2" // It's the blue egg in items_left/righthand
- w_class = 1
+ item_color = "blue"
-/obj/item/toy/therapy_yellow
- name = "yellow therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is yellow."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapyyellow"
+/obj/item/toy/therapy/yellow
item_state = "egg5" // It's the yellow egg in items_left/righthand
- w_class = 1
+ item_color = "yellow"
-/obj/item/toy/therapy_orange
- name = "orange therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is orange."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapyorange"
+/obj/item/toy/therapy/orange
item_state = "egg4" // It's the red one again, lacking an orange item_state and making a new one is pointless
- w_class = 1
+ item_color = "orange"
-/obj/item/toy/therapy_green
- name = "green therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is green."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapygreen"
+/obj/item/toy/therapy/green
item_state = "egg3" // It's the green egg in items_left/righthand
- w_class = 1
+ item_color = "green"
/obj/item/weapon/toddler
icon_state = "toddler"
@@ -1264,7 +1257,7 @@ obj/item/toy/cards/deck/syndicate/black
var/message = generate_ion_law()
user << "You press the button on [src]."
playsound(user, 'sound/machines/click.ogg', 20, 1)
- src.loc.visible_message("\icon[src] [message]")
+ visible_message("\icon[src] [message]")
cooldown = 1
spawn(30) cooldown = 0
return
@@ -1283,7 +1276,7 @@ obj/item/toy/cards/deck/syndicate/black
var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!")
user << "You pull the string on the [src]."
playsound(user, 'sound/misc/hoot.ogg', 25, 1)
- src.loc.visible_message("\icon[src] [message]")
+ visible_message("\icon[src] [message]")
cooldown = 1
spawn(30) cooldown = 0
return
@@ -1302,7 +1295,7 @@ obj/item/toy/cards/deck/syndicate/black
var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!")
user << "You pull the string on the [src]."
playsound(user, 'sound/misc/caw.ogg', 25, 1)
- src.loc.visible_message("\icon[src] [message]")
+ visible_message("\icon[src] [message]")
cooldown = 1
spawn(30) cooldown = 0
return
@@ -1534,13 +1527,6 @@ obj/item/toy/cards/deck/syndicate/black
else
icon_state = "chainsaw0"
-/obj/item/weapon/twohanded/toy/chainsaw/attack(mob/target as mob, mob/living/user as mob)
- if(wielded)
- playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1)
- else
- playsound(loc, "swing_hit", 50, 1, -1)
- ..()
-
/*
* Action Figures
*/
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index a24733a3e83..8ca714d7666 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -83,7 +83,7 @@
/obj/item/toy/crossbow,
/obj/item/weapon/gun/projectile/revolver/capgun,
/obj/item/toy/katana,
- /obj/random/prize,
+ /obj/random/mech,
/obj/item/toy/spinningtoy,
/obj/item/toy/sword,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 685ddc04466..a898c7cca91 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -673,4 +673,15 @@
new /obj/item/weapon/lipstick/black(src)
new /obj/item/weapon/lipstick/green(src)
new /obj/item/weapon/lipstick/blue(src)
- new /obj/item/weapon/lipstick/white(src)
\ No newline at end of file
+ new /obj/item/weapon/lipstick/white(src)
+
+/obj/item/weapon/storage/box/foam_darts
+ name = "Foam Dart Pack"
+ desc = "Extra ammo for foam dart launchers. Contains 10 darts."
+ storage_slots = 10
+ max_combined_w_class = 10
+
+/obj/item/weapon/storage/box/foam_darts/New()
+ ..()
+ for(var/i=1; i <= storage_slots; i++)
+ new /obj/item/toy/ammo/crossbow(src)
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 7e483b3ccbf..e34f9687d7e 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -1,7 +1,8 @@
/obj/item/weapon/storage/wallet
- name = "wallet"
- desc = "It can hold a few small and personal things."
+ name = "leather wallet"
+ desc = "Made from genuine leather, it is of the highest quality."
storage_slots = 10
+ icon = 'icons/obj/wallets.dmi'
icon_state = "wallet"
w_class = 2
can_hold = list(
@@ -94,4 +95,62 @@
if(item2_type)
new item2_type(src)
if(item3_type)
- new item3_type(src)
\ No newline at end of file
+ new item3_type(src)
+
+//////////////////////////////////////
+// Color Wallets //
+//////////////////////////////////////
+
+/obj/item/weapon/storage/wallet/color
+ name = "cheap wallet"
+ desc = "A cheap wallet from the arcade."
+ storage_slots = 5 //smaller storage than normal wallets
+
+/obj/item/weapon/storage/wallet/color/New()
+ ..()
+ if(!item_color)
+ var/color_wallet = pick(subtypesof(/obj/item/weapon/storage/wallet/color))
+ new color_wallet(src.loc)
+ qdel(src)
+ return
+ UpdateDesc()
+
+/obj/item/weapon/storage/wallet/color/proc/UpdateDesc()
+ name = "cheap [item_color] wallet"
+ desc = "A cheap, [item_color] wallet from the arcade."
+ icon_state = "[item_color]_wallet"
+
+/obj/item/weapon/storage/wallet/color/update_icon()
+ if(front_id)
+ switch(front_id.icon_state)
+ if("id")
+ icon_state = "[item_color]_walletid"
+ return
+ if("silver")
+ icon_state = "[item_color]_walletid_silver"
+ return
+ if("gold")
+ icon_state = "[item_color]_walletid_gold"
+ return
+ if("centcom")
+ icon_state = "[item_color]_walletid_centcom"
+ return
+ icon_state = "[item_color]_wallet"
+
+/obj/item/weapon/storage/wallet/color/blue
+ item_color = "blue"
+
+/obj/item/weapon/storage/wallet/color/red
+ item_color = "red"
+
+/obj/item/weapon/storage/wallet/color/yellow
+ item_color = "yellow"
+
+/obj/item/weapon/storage/wallet/color/green
+ item_color = "green"
+
+/obj/item/weapon/storage/wallet/color/pink
+ item_color = "pink"
+
+/obj/item/weapon/storage/waller/color/brown
+ item_color = "brown"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index c456cb9c9a6..93e510b0641 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -89,4 +89,70 @@
victim.apply_effect(6, STUTTER, 0)
victim.take_organ_damage(10)
- occupant.visible_message("[occupant] crashed into \the [A]!")
\ No newline at end of file
+ occupant.visible_message("[occupant] crashed into \the [A]!")
+
+/obj/structure/stool/bed/chair/wheelchair/bike
+ name = "bicycle"
+ desc = "Two wheels of FURY!"
+ //placeholder until i get a bike sprite
+ icon = 'icons/vehicles/motorcycle.dmi'
+ icon_state = "motorcycle_4dir"
+
+/obj/structure/stool/bed/chair/wheelchair/bike/relaymove(mob/user, direction)
+ if(propelled)
+ return 0
+
+ if(!Process_Spacemove(direction) || !has_gravity(src.loc) || !isturf(loc)) //bikes in space.
+ return 0
+
+ if(world.time < move_delay)
+ return
+
+ var/calculated_move_delay
+ calculated_move_delay = 0 //bikes are infact sport bikes
+
+ if(buckled_mob)
+ if(buckled_mob.incapacitated())
+ unbuckle_mob() //if the rider is incapacitated, unbuckle them (they can't balance so they fall off)
+ return 0
+
+ var/mob/living/thedriver = user
+ var/mob_delay = thedriver.movement_delay()
+ if(mob_delay > 0)
+ calculated_move_delay += mob_delay
+
+ if(ishuman(buckled_mob))
+ var/mob/living/carbon/human/driver = user
+ var/obj/item/organ/external/l_hand = driver.get_organ("l_hand")
+ var/obj/item/organ/external/r_hand = driver.get_organ("r_hand")
+ if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED)))
+ calculated_move_delay += 0.5 //I can ride my bike with no handlebars... (but it's slower)
+
+ for(var/organ_name in list("l_leg","r_leg","l_foot","r_foot"))
+ var/obj/item/organ/external/E = driver.get_organ(organ_name)
+ if(!E || (E.status & ORGAN_DESTROYED))
+ return 0 //Bikes need both feet/legs to work. missing even one makes it so you can't ride the bike
+ else if(E.status & ORGAN_SPLINTED)
+ calculated_move_delay += 0.5
+ else if(E.status & ORGAN_BROKEN)
+ calculated_move_delay += 1.5
+
+ move_delay = world.time
+ move_delay += calculated_move_delay
+
+ if(!buckled_mob.Move(get_step(buckled_mob, direction), direction))
+ loc = buckled_mob.loc //we gotta go back
+ last_move = buckled_mob.last_move
+ inertia_dir = last_move
+ buckled_mob.inertia_dir = last_move
+ . = 0
+
+ else
+ . = 1
+
+/obj/structure/stool/bed/chair/wheelchair/handle_rotation()
+ overlays = null
+ var/image/O = image(icon = 'icons/vehicles/motorcycle.dmi', icon_state = "motorcycle_overlay_4d", layer = FLY_LAYER, dir = src.dir)
+ overlays += O
+ if(buckled_mob)
+ buckled_mob.dir = dir
\ No newline at end of file
diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm
index 960ead4a0b6..f57a64de03c 100644
--- a/code/modules/arcade/arcade_prize.dm
+++ b/code/modules/arcade/arcade_prize.dm
@@ -1,3 +1,7 @@
+/*Contains:
+* Prize balls
+* Prize tickets
+*/
/obj/item/toy/prizeball
name = "prize ball"
@@ -5,6 +9,7 @@
icon = 'icons/obj/arcade.dmi'
icon_state = "prizeball_1"
var/opening = 0
+ var/possible_contents = list(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure, /obj/item/toy/eight_ball, /obj/item/stack/tickets)
/obj/item/toy/prizeball/New()
..()
@@ -17,8 +22,68 @@
playsound(src.loc, 'sound/items/bubblewrap.ogg', 30, 1, extrarange = -4, falloff = 10)
icon_state = "prizeconfetti"
src.color = pick(random_color_list)
- var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure, /obj/item/toy/eight_ball) //will add ticket bundles later
+ var/prize_inside = pick(possible_contents)
spawn(10)
user.unEquip(src)
- new prize_inside(user.loc)
- qdel(src)
\ No newline at end of file
+ if(istype(prize_inside, /obj/item/stack))
+ var/amount = pick(5, 10, 15, 25, 50)
+ new prize_inside(user.loc, amount)
+ else
+ new prize_inside(user.loc)
+ qdel(src)
+
+/obj/item/toy/prizeball/mech
+ name = "mecha figure capsule"
+ desc = "Contains one collectible mecha figure!"
+ possible_contents = list(/obj/random/mech)
+
+/obj/item/toy/prizeball/carp_plushie
+ name = "carp plushie capsule"
+ desc = "Contains one space carp plushie!"
+ possible_contents = list(/obj/random/carp_plushie)
+
+/obj/item/toy/prizeball/plushie
+ name = "animal plushie capsule"
+ desc = "Contains one cuddly animal plushie!"
+ possible_contents = list(/obj/random/plushie)
+
+/obj/item/toy/prizeball/figure
+ name = "action figure capsule"
+ desc = "Contains one action figure!"
+ possible_contents = list(/obj/random/figure)
+
+/obj/item/toy/prizeball/therapy
+ name = "therapy doll capsule"
+ desc = "Contains one squishy therapy doll."
+ possible_contents = list(/obj/random/therapy)
+
+/obj/item/stack/tickets
+ name = "prize ticket"
+ desc = "Prize tickets from the arcade. Exchange them for fabulous prizes!"
+ singular_name = "prize ticket"
+ icon = 'icons/obj/arcade.dmi'
+ icon_state = "tickets_1"
+ force = 0
+ throwforce = 0
+ throw_speed = 1
+ throw_range = 1
+ w_class = 1.0
+ max_amount = 9999 //Dang that's a lot of tickets
+
+/obj/item/stack/tickets/New(var/loc, var/amount=null)
+ ..()
+ update_icon()
+
+/obj/item/stack/tickets/attack_self(mob/user as mob)
+ return
+
+/obj/item/stack/tickets/update_icon()
+ var/amount = get_amount()
+ if((amount >= 75))
+ icon_state = "tickets_4"
+ else if(amount >=25)
+ icon_state = "tickets_3"
+ else if(amount >= 4)
+ icon_state = "tickets_2"
+ else
+ icon_state = "tickets_1"
\ No newline at end of file
diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm
new file mode 100644
index 00000000000..51c3a43a700
--- /dev/null
+++ b/code/modules/arcade/prize_counter.dm
@@ -0,0 +1,221 @@
+
+/obj/machinery/prize_counter
+ name = "Prize Counter"
+ desc = "A machine which exchanges tickets for a variety of fabulous prizes!"
+ icon = 'icons/obj/arcade.dmi'
+ icon_state = "prize_counter-on"
+ density = 1
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 40
+ var/tickets = 0
+ var/prize_tier = 1 //Increased by matter bin rating, unlocks more prize options per tier
+
+/obj/machinery/prize_counter/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/prize_counter(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/prize_counter/upgraded/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/prize_counter(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin/bluespace(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/prize_counter/RefreshParts()
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ prize_tier = B.rating
+
+/obj/machinery/prize_counter/update_icon()
+ if(stat & BROKEN)
+ icon_state = "prize_counter-broken"
+ else if(panel_open)
+ icon_state = "prize_counter-open"
+ else if(stat & NOPOWER)
+ icon_state = "prize_counter-off"
+ else
+ icon_state = "prize_counter-on"
+ return
+
+/obj/machinery/prize_counter/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+ if(istype(O, /obj/item/stack/tickets))
+ var/obj/item/stack/tickets/T = O
+ if(user.unEquip(T)) //Because if you can't drop it for some reason, you shouldn't be increasing the tickets var
+ tickets += T.amount
+ qdel(T)
+ else
+ user << "\The [T] seems stuck to your hand!"
+ return
+ if(istype(O, /obj/item/weapon/screwdriver) && anchored)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ panel_open = !panel_open
+ user << "You [panel_open ? "open" : "close"] the maintenance panel."
+ update_icon()
+ return
+ if(panel_open)
+ if(istype(O, /obj/item/weapon/wrench))
+ default_unfasten_wrench(user, O)
+ if(component_parts && istype(O, /obj/item/weapon/crowbar))
+ if(tickets) //save the tickets!
+ print_tickets()
+ default_deconstruction_crowbar(O)
+
+/obj/machinery/prize_counter/attack_hand(mob/user as mob)
+ if(..())
+ return
+ add_fingerprint(user)
+ interact(user)
+
+/obj/machinery/prize_counter/interact(mob/user as mob)
+ user.set_machine(src)
+
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ var/dat = {"
+
+
+ Arcade Ticket Exchange
+
+
+
+ Tickets: [tickets] | Eject Tickets
+ Arcade Ticket Exchange
+
+ Exchange that pile of tickets for a pile of cool prizes!
+
+ Available Prizes:
+
+
+ | # |
+ Name/Description |
+ Price |
+
+
+ "}
+
+ for(var/datum/prize_item/item in global_prizes.prizes)
+ var/cost_class="affordable"
+ if(item.cost>tickets)
+ cost_class="toomuch"
+ var/itemID = global_prizes.prizes.Find(item)
+ dat += {"
+
+ |
+ [itemID]
+ |
+
+ [item.name]
+ [item.desc]
+ |
+ "}
+ if(prize_tier >= item.tier_unlocked)
+ dat += {"
+
+ [item.cost] Tickets
+ |
+
+ "}
+ else
+ dat += {"
+
+ LOCKED.
+ |
+
+ "}
+
+ dat += {"
+
+
+
+"}
+ user << browse(dat, "window=prize_counter")
+ onclose(user, "prize_counter")
+ return
+
+/obj/machinery/prize_counter/Topic(href, href_list)
+ if(..())
+ return 1
+
+ add_fingerprint(usr)
+
+ if(href_list["eject"])
+ print_tickets()
+
+ if (href_list["buy"])
+ var/itemID = text2num(href_list["buy"])
+ var/datum/prize_item/item = global_prizes.prizes[itemID]
+ var/sure = alert(usr,"Are you sure you wish to purchase [item.name] for [item.cost] tickets?","You sure?","Yes","No") in list("Yes","No")
+ if(sure=="No")
+ updateUsrDialog()
+ return
+ if(!global_prizes.PlaceOrder(src, itemID))
+ usr << "Unable to complete the exchange."
+ else
+ usr << "You've successfully purchased the item."
+
+ interact(usr)
+ return
+
+/obj/machinery/prize_counter/proc/print_tickets()
+ if(!tickets)
+ return
+ if(tickets >= 9999)
+ new /obj/item/stack/tickets(get_turf(src), 9999) //max stack size
+ tickets -= 9999
+ print_tickets()
+ else
+ new /obj/item/stack/tickets(get_turf(src), tickets)
+ tickets = 0
\ No newline at end of file
diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm
new file mode 100644
index 00000000000..879efe1c3ce
--- /dev/null
+++ b/code/modules/arcade/prize_datums.dm
@@ -0,0 +1,343 @@
+
+var/global/datum/prizes/global_prizes = new
+
+/datum/prizes
+ var/list/prizes = list()
+
+/datum/prizes/New()
+ for(var/itempath in subtypesof(/datum/prize_item))
+ prizes += new itempath()
+
+/datum/prizes/proc/PlaceOrder(var/obj/machinery/prize_counter/prize_counter, var/itemID)
+ if(!prize_counter)
+ return 0
+ var/datum/prize_item/item = global_prizes.prizes[itemID]
+ if(!item)
+ return 0
+ if(prize_counter.tickets >= item.cost)
+ new item.typepath(prize_counter.loc)
+ prize_counter.visible_message("Enjoy your prize!")
+ return 1
+ else
+ prize_counter.visible_message("Not enough tickets!")
+ return 0
+
+//////////////////////////////////////
+// prize_item datum //
+//////////////////////////////////////
+
+/datum/prize_item
+ var/name = "Prize"
+ var/desc = "This shouldn't show up..."
+ var/typepath = /obj/item/toy/prizeball
+ var/cost = 0
+ var/tier_unlocked = 0 //minimum tier needed to unlock the ability to select this prize
+
+//////////////////////////////////////
+// Tier 1 Prizes //
+//////////////////////////////////////
+
+/datum/prize_item/balloon
+ name = "Water Balloon"
+ desc = "A thin balloon for throwing liquid at people."
+ typepath = /obj/item/toy/balloon
+ cost = 10
+ tier_unlocked = 1
+
+/datum/prize_item/crayons
+ name = "Box of Crayons"
+ desc = "A six-pack of crayons, just like back in kindergarten."
+ typepath = /obj/item/weapon/storage/fancy/crayons
+ cost = 35
+ tier_unlocked = 1
+
+/datum/prize_item/snappops
+ name = "Snap-Pops"
+ desc = "A box of exploding snap-pop fireworks."
+ typepath = /obj/item/weapon/storage/box/snappops
+ cost = 20
+ tier_unlocked = 1
+
+/datum/prize_item/spinningtoy
+ name = "Spinning Toy"
+ desc = "Looks like an authentic Singularity!"
+ typepath = /obj/item/toy/spinningtoy
+ cost = 15
+ tier_unlocked = 1
+
+/datum/prize_item/blinktoy
+ name = "Blink toy"
+ desc = "Blink. Blink. Blink."
+ typepath = /obj/item/toy/blink
+ cost = 15
+ tier_unlocked = 1
+
+/datum/prize_item/dice
+ name = "Dice set"
+ desc = "A set of assorted dice."
+ typepath = /obj/item/weapon/storage/box/dice
+ cost = 20
+ tier_unlocked = 1
+
+/datum/prize_item/cards
+ name = "Deck of cards"
+ desc = "Anyone fancy a game of 52-card Pickup?"
+ typepath = /obj/item/toy/cards/deck
+ cost = 25
+ tier_unlocked = 1
+
+/datum/prize_item/wallet
+ name = "Colored Wallet"
+ desc = "Brightly colored and big enough for standard issue ID cards."
+ typepath = /obj/item/weapon/storage/wallet/color
+ cost = 50
+ tier_unlocked = 1
+
+/datum/prize_item/pet_rock
+ name = "pet rock"
+ desc = "A pet of your very own!"
+ typepath = /obj/item/toy/pet_rock
+ cost = 80
+ tier_unlocked = 1
+
+/datum/prize_item/foam_darts
+ name = "Pack of Foam Darts"
+ desc = "A refill pack of 10 foam darts."
+ typepath = /obj/item/weapon/storage/box/foam_darts
+ cost = 20
+ tier_unlocked = 1
+
+/datum/prize_item/minigibber
+ name = "Minigibber Toy"
+ desc = "A model of the station gibber. Probably shouldn't stick your fingers in it."
+ typepath = /obj/item/toy/minigibber
+ cost = 60
+ tier_unlocked = 1
+
+/datum/prize_item/id_sticker
+ name = "Prisoner ID Sticker"
+ desc = "A sticker that can make any ID look like a prisoner ID."
+ typepath = /obj/item/weapon/id_decal/prisoner
+ cost = 50
+ tier_unlocked = 1
+
+/datum/prize_item/id_sticker/silver
+ name = "Silver ID Sticker"
+ desc = "A sticker that can make any ID look like a silver ID."
+ typepath = /obj/item/weapon/id_decal/silver
+
+/datum/prize_item/id_sticker/gold
+ name = "Gold ID Sticker"
+ desc = "A sticker that can make any ID look like a golden ID."
+ typepath = /obj/item/weapon/id_decal/gold
+
+/datum/prize_item/id_sticker/centcom
+ name = "Centcomm ID Sticker"
+ desc = "A sticker that can make any ID look like a Central Command ID."
+ typepath = /obj/item/weapon/id_decal/centcom
+
+/datum/prize_item/id_sticker/emag
+ name = "Suspicious ID Sticker"
+ desc = "A sticker that can make any ID look like something suspicious..."
+ typepath = /obj/item/weapon/id_decal/emag
+
+//////////////////////////////////////
+// Tier 2 Prizes //
+//////////////////////////////////////
+
+/datum/prize_item/carp_plushie
+ name = "Random Carp Plushie"
+ desc = "A colorful fish-shaped plush toy."
+ typepath = /obj/item/toy/prizeball/carp_plushie
+ cost = 75
+ tier_unlocked = 2
+
+/datum/prize_item/therapy_doll
+ name = "Random Therapy Doll"
+ desc = "A therapeutic doll for relieving stress without being charged with assault."
+ typepath = /obj/item/toy/prizeball/therapy
+ cost = 60
+ tier_unlocked = 2
+
+/datum/prize_item/plushie
+ name = "Random Animal Plushie"
+ desc = "A colorful animal-shaped plush toy."
+ typepath = /obj/item/toy/prizeball/plushie
+ cost = 75
+ tier_unlocked = 2
+
+/datum/prize_item/mech_toy
+ name = "Random Mecha"
+ desc = "A random mecha figure, collect all 11!"
+ typepath = /obj/item/toy/prizeball/mech
+ cost = 75
+ tier_unlocked = 2
+
+/datum/prize_item/action_figure
+ name = "Random Action Figure"
+ desc = "A random action figure, collect them all!"
+ typepath = /obj/item/toy/prizeball/figure
+ cost = 75
+ tier_unlocked = 2
+
+/datum/prize_item/eight_ball
+ name = "Magic Eight Ball"
+ desc = "A mystical ball that can divine the future!"
+ typepath = /obj/item/toy/eight_ball
+ cost = 40
+ tier_unlocked = 2
+
+/datum/prize_item/tacticool
+ name = "Tacticool Turtleneck"
+ desc = "A cool-looking turtleneck."
+ typepath = /obj/item/clothing/under/syndicate/tacticool
+ cost = 90
+ tier_unlocked = 2
+
+/datum/prize_item/crossbow
+ name = "Foam Dart Crossbow"
+ desc = "A toy crossbow that fires foam darts."
+ typepath = /obj/item/toy/crossbow
+ cost = 100
+ tier_unlocked = 2
+
+/datum/prize_item/toy_xeno
+ name = "Xeno Action Figure"
+ desc = "A lifelike replica of the horrific xeno scourge."
+ typepath = /obj/item/toy/toy_xeno
+ cost = 80
+ tier_unlocked = 2
+
+/datum/prize_item/fakespell
+ name = "Fake Spellbook"
+ desc = "Perform magic! Astound your friends! Get mistaken for an enemy of the corporation!"
+ typepath = /obj/item/weapon/spellbook/oneuse/fake_gib
+ cost = 100
+ tier_unlocked = 2
+
+/datum/prize_item/capgun
+ name = "Capgun Revolver"
+ desc = "Do you feel lucky... punk?"
+ typepath = /obj/item/weapon/gun/projectile/revolver/capgun
+ cost = 75
+ tier_unlocked = 2
+
+//////////////////////////////////////
+// Tier 3 Prizes //
+//////////////////////////////////////
+
+/datum/prize_item/magic_conch
+ name = "Magic Conch Shell"
+ desc = "All hail the magic conch!"
+ typepath = /obj/item/toy/eight_ball/conch
+ cost = 100
+ tier_unlocked = 3
+
+/datum/prize_item/flash
+ name = "Toy Flash"
+ desc = "AUGH! MY EYES!"
+ typepath = /obj/item/toy/flash
+ cost = 50
+ tier_unlocked = 3
+
+/datum/prize_item/foamblade
+ name = "Foam Armblade"
+ desc = "Perfect for reenacting space horror holo-vids."
+ typepath = /obj/item/toy/foamblade
+ cost = 100
+ tier_unlocked = 3
+
+/datum/prize_item/minimeteor
+ name = "Mini-Meteor"
+ desc = "Meteors have been detected on a collision course with your fun times!"
+ typepath = /obj/item/toy/minimeteor
+ cost = 50
+ tier_unlocked = 3
+
+/datum/prize_item/redbutton
+ name = "Shiny Red Button"
+ desc = "PRESS IT!"
+ typepath = /obj/item/toy/redbutton
+ cost = 100
+ tier_unlocked = 3
+
+/datum/prize_item/owl
+ name = "Owl Action Figure"
+ desc = "Remember: heroes don't grief!"
+ typepath = /obj/item/toy/owl
+ cost = 125
+ tier_unlocked = 3
+
+/datum/prize_item/griffin
+ name = "Griffin Action Figure"
+ desc = "If you can't be the best, you can always be the WORST."
+ typepath = /obj/item/toy/griffin
+ cost = 125
+ tier_unlocked = 3
+
+/datum/prize_item/AI
+ name = "Toy AI Unit"
+ desc = "Law 1: Maximize fun for crew."
+ typepath = /obj/item/toy/AI
+ cost = 75
+ tier_unlocked = 3
+
+/datum/prize_item/tommygun
+ name = "Tommygun"
+ desc = "A replica tommygun that fires foam darts."
+ typepath = /obj/item/toy/crossbow/tommygun
+ cost = 175
+ tier_unlocked = 3
+
+/datum/prize_item/esword
+ name = "Toy Energy Sword"
+ desc = "A plastic replica of an energy blade."
+ typepath = /obj/item/toy/sword
+ cost = 150
+ tier_unlocked = 3
+
+/datum/prize_item/blobhat
+ name = "Blob Hat"
+ desc = "There's... something... on your head..."
+ typepath = /obj/item/clothing/head/blob
+ cost = 125
+ tier_unlocked = 3
+
+/datum/prize_item/nuke
+ name = "Nuclear Fun Device"
+ desc = "Annihilate boredom with an explosion of excitement!"
+ typepath = /obj/item/toy/nuke
+ cost = 100
+ tier_unlocked = 3
+
+//////////////////////////////////////
+// Tier 4 Prizes //
+//////////////////////////////////////
+
+/datum/prize_item/chainsaw
+ name = "Toy Chainsaw"
+ desc = "A full-scale model chainsaw, based on that massacre in Space Texas."
+ typepath = /obj/item/weapon/twohanded/toy/chainsaw
+ cost = 200
+ tier_unlocked = 4
+
+/datum/prize_item/spacesuit
+ name = "Fake Spacesuit"
+ desc = "A replica spacesuit. Not actually spaceworthy."
+ typepath = /obj/item/weapon/storage/box/fakesyndiesuit
+ cost = 180
+ tier_unlocked = 4
+
+/datum/prize_item/fakespace
+ name = "Space Carpet"
+ desc = "A stack of carpeted floor tiles that resemble space."
+ typepath = /obj/item/stack/tile/fakespace/loaded
+ cost = 150
+ tier_unlocked = 4
+
+/datum/prize_item/bike
+ name = "Awesome Bike!"
+ desc = "WOAH."
+ typepath = /obj/structure/stool/bed/chair/wheelchair/bike
+ cost = 10000 //max stack + 1 tickets
+ tier_unlocked = 4
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index fb97c2b693c..648193a316b 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -490,4 +490,13 @@
build_type = IMPRINTER
materials = list(MAT_GLASS=1000, "sacid"=20)
build_path = /obj/item/weapon/circuitboard/clawgame
- category = list ("Misc. Machinery")
\ No newline at end of file
+ category = list ("Misc. Machinery")
+
+/datum/design/prize_counter
+ name = "Machine Design (Prize Counter)"
+ desc = "The circuit board for an arcade Prize Counter."
+ req_tech = list("programming" = 2, "materials" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS=1000, "sacid"=20)
+ build_path = /obj/item/weapon/circuitboard/prize_counter
+ category = list("Misc. Machinery")
\ No newline at end of file
diff --git a/icons/obj/arcade.dmi b/icons/obj/arcade.dmi
index 50f8e800273..9861aea35c9 100644
Binary files a/icons/obj/arcade.dmi and b/icons/obj/arcade.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 111bc8d2061..dc7e9b30054 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/wallets.dmi b/icons/obj/wallets.dmi
new file mode 100644
index 00000000000..0a96bc16f5c
Binary files /dev/null and b/icons/obj/wallets.dmi differ
diff --git a/icons/vehicles/motorcycle.dmi b/icons/vehicles/motorcycle.dmi
index 8b5a004fa5d..2f3c2d5517f 100644
Binary files a/icons/vehicles/motorcycle.dmi and b/icons/vehicles/motorcycle.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 0b932735ca4..b882207115b 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -989,6 +989,8 @@
#include "code\modules\arcade\arcade_base.dm"
#include "code\modules\arcade\arcade_prize.dm"
#include "code\modules\arcade\claw_game.dm"
+#include "code\modules\arcade\prize_counter.dm"
+#include "code\modules\arcade\prize_datums.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm"
#include "code\modules\assembly\health.dm"