mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-14 19:41:53 +00:00
930 lines
28 KiB
Plaintext
930 lines
28 KiB
Plaintext
/* Toys!
|
|
* ContainsL
|
|
* Balloons
|
|
* Fake telebeacon
|
|
* Fake singularity
|
|
* Toy gun
|
|
* Toy crossbow
|
|
* Toy Tommy Gun
|
|
* Toy swords
|
|
* Crayons
|
|
* Snap pops
|
|
* Water flower
|
|
* Toy Nuke
|
|
* Card Deck -- Ported from /TG/
|
|
*/
|
|
|
|
|
|
/obj/item/toy
|
|
throwforce = 0
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
force = 0
|
|
|
|
|
|
/*
|
|
* Balloons
|
|
*/
|
|
/obj/item/toy/balloon
|
|
name = "water balloon"
|
|
desc = "A translucent balloon. There's nothing in it."
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "waterballoon-e"
|
|
item_state = "balloon-empty"
|
|
|
|
/obj/item/toy/balloon/New()
|
|
var/datum/reagents/R = new/datum/reagents(10)
|
|
reagents = R
|
|
R.my_atom = src
|
|
|
|
/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
|
|
return
|
|
|
|
/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
|
|
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()
|
|
return
|
|
|
|
/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob)
|
|
if(istype(O, /obj/item/weapon/reagent_containers/glass))
|
|
if(O.reagents)
|
|
if(O.reagents.total_volume < 1)
|
|
user << "The [O] is empty."
|
|
else if(O.reagents.total_volume >= 1)
|
|
if(O.reagents.has_reagent("pacid", 1))
|
|
user << "The acid chews through the balloon!"
|
|
O.reagents.reaction(user)
|
|
del(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]."
|
|
O.reagents.trans_to(src, 10)
|
|
src.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))
|
|
for(var/atom/A in get_turf(hit_atom))
|
|
src.reagents.reaction(A)
|
|
src.icon_state = "burst"
|
|
spawn(5)
|
|
if(src)
|
|
del(src)
|
|
return
|
|
|
|
/obj/item/toy/balloon/update_icon()
|
|
if(src.reagents.total_volume >= 1)
|
|
icon_state = "waterballoon"
|
|
item_state = "balloon"
|
|
else
|
|
icon_state = "waterballoon-e"
|
|
item_state = "balloon-empty"
|
|
|
|
/obj/item/toy/syndicateballoon
|
|
name = "syndicate balloon"
|
|
desc = "There is a tag on the back that reads \"FUK NT!11!\"."
|
|
throwforce = 0
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
force = 0
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "syndballoon"
|
|
item_state = "syndballoon"
|
|
w_class = 4.0
|
|
|
|
/*
|
|
* Fake telebeacon
|
|
*/
|
|
/obj/item/toy/blink
|
|
name = "electronic blink toy game"
|
|
desc = "Blink. Blink. Blink. Ages 8 and up."
|
|
icon = 'icons/obj/radio.dmi'
|
|
icon_state = "beacon"
|
|
item_state = "signaler"
|
|
|
|
/*
|
|
* Fake singularity
|
|
*/
|
|
/obj/item/toy/spinningtoy
|
|
name = "Gravitational Singularity"
|
|
desc = "\"Singulo\" brand spinning toy."
|
|
icon = 'icons/obj/singularity.dmi'
|
|
icon_state = "singularity_s1"
|
|
|
|
/*
|
|
* Toy gun: Why isnt this an /obj/item/weapon/gun?
|
|
*/
|
|
/obj/item/toy/gun
|
|
name = "cap gun"
|
|
desc = "There are 0 caps left. Looks almost like the real thing! Ages 8 and up. Please recycle in an autolathe when you're out of caps!"
|
|
icon = 'icons/obj/gun.dmi'
|
|
icon_state = "revolver"
|
|
item_state = "gun"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
slot_flags = SLOT_BELT
|
|
w_class = 3.0
|
|
g_amt = 10
|
|
m_amt = 10
|
|
attack_verb = list("struck", "pistol whipped", "hit", "bashed")
|
|
var/bullets = 7.0
|
|
|
|
examine()
|
|
set src in usr
|
|
|
|
src.desc = text("There are [] caps\s left. Looks almost like the real thing! Ages 8 and up.", src.bullets)
|
|
..()
|
|
return
|
|
|
|
attackby(obj/item/toy/ammo/gun/A as obj, mob/user as mob)
|
|
|
|
if (istype(A, /obj/item/toy/ammo/gun))
|
|
if (src.bullets >= 7)
|
|
user << "\blue It's already fully loaded!"
|
|
return 1
|
|
if (A.amount_left <= 0)
|
|
user << "\red There is no more caps!"
|
|
return 1
|
|
if (A.amount_left < (7 - src.bullets))
|
|
src.bullets += A.amount_left
|
|
user << text("\red You reload [] caps\s!", A.amount_left)
|
|
A.amount_left = 0
|
|
else
|
|
user << text("\red You reload [] caps\s!", 7 - src.bullets)
|
|
A.amount_left -= 7 - src.bullets
|
|
src.bullets = 7
|
|
A.update_icon()
|
|
return 1
|
|
return
|
|
|
|
afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
|
|
if (flag)
|
|
return
|
|
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
|
usr << "\red You don't have the dexterity to do this!"
|
|
return
|
|
src.add_fingerprint(user)
|
|
if (src.bullets < 1)
|
|
user.show_message("\red *click* *click*", 2)
|
|
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
|
return
|
|
playsound(user, 'sound/weapons/Gunshot.ogg', 100, 1)
|
|
src.bullets--
|
|
for(var/mob/O in viewers(user, null))
|
|
O.show_message(text("\red <B>[] fires a cap gun at []!</B>", user, target), 1, "\red You hear a gunshot", 2)
|
|
|
|
/obj/item/toy/ammo/gun
|
|
name = "ammo-caps"
|
|
desc = "There are 7 caps left! Make sure to recyle the box in an autolathe when it gets empty."
|
|
icon = 'icons/obj/ammo.dmi'
|
|
icon_state = "357-7"
|
|
flags = FPRINT | TABLEPASS| CONDUCT
|
|
w_class = 1.0
|
|
g_amt = 10
|
|
m_amt = 10
|
|
var/amount_left = 7.0
|
|
|
|
update_icon()
|
|
src.icon_state = text("357-[]", src.amount_left)
|
|
src.desc = text("There are [] caps\s left! Make sure to recycle the box in an autolathe when it gets empty.", src.amount_left)
|
|
return
|
|
|
|
/*
|
|
* Toy crossbow
|
|
*/
|
|
|
|
/obj/item/toy/crossbow
|
|
name = "foam dart crossbow"
|
|
desc = "A weapon favored by many overactive children. Ages 8 and up."
|
|
icon = 'icons/obj/gun.dmi'
|
|
icon_state = "crossbow"
|
|
item_state = "crossbow"
|
|
flags = FPRINT | TABLEPASS
|
|
w_class = 2.0
|
|
attack_verb = list("attacked", "struck", "hit")
|
|
var/bullets = 5
|
|
|
|
examine()
|
|
set src in view(2)
|
|
..()
|
|
if (bullets)
|
|
usr << "\blue It is loaded with [bullets] foam darts!"
|
|
|
|
attackby(obj/item/I as obj, mob/user as mob)
|
|
if(istype(I, /obj/item/toy/ammo/crossbow))
|
|
if(bullets <= 4)
|
|
user.drop_item()
|
|
del(I)
|
|
bullets++
|
|
user << "\blue You load the foam dart into the crossbow."
|
|
else
|
|
usr << "\red 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
|
|
|
|
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/mob/living/M in D.loc)
|
|
if(!istype(M,/mob/living)) continue
|
|
if(M == user) continue
|
|
D.visible_message("<span class='danger'>[M] was hit by the foam dart!</span>")
|
|
new /obj/item/toy/ammo/crossbow(M.loc)
|
|
del(D)
|
|
return
|
|
|
|
for(var/atom/A in D.loc)
|
|
if(A == user) continue
|
|
if(A.density)
|
|
new /obj/item/toy/ammo/crossbow(A.loc)
|
|
del(D)
|
|
|
|
sleep(1)
|
|
|
|
spawn(10)
|
|
if(D)
|
|
new /obj/item/toy/ammo/crossbow(D.loc)
|
|
del(D)
|
|
|
|
return
|
|
else if (bullets == 0)
|
|
user.Weaken(5)
|
|
user.visible_message("<span class='danger'>[] realized they were out of ammo and starting scrounging for some!</span>")
|
|
|
|
|
|
|
|
attack(mob/M as mob, mob/user as mob)
|
|
src.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("<span class='danger'><B>[] casually lines up a shot with []'s head and pulls the trigger!</B></span>", user, M), 1, "<span class='danger'>You hear the sound of foam against skull.</span>", 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("<span class='danger'><B>[] 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!</B></span>", user, M), 1, "<span class='danger'>You hear someone fall.</span>", 2)
|
|
user.Weaken(5)
|
|
return
|
|
|
|
/obj/item/toy/ammo/crossbow
|
|
name = "foam dart"
|
|
desc = "Its nerf or nothing! Ages 8 and up."
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "foamdart"
|
|
flags = FPRINT | TABLEPASS
|
|
w_class = 1.0
|
|
|
|
/obj/effect/foam_dart_dummy
|
|
name = ""
|
|
desc = ""
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "null"
|
|
anchored = 1
|
|
density = 0
|
|
|
|
|
|
/*
|
|
* Tommy gun
|
|
*/
|
|
|
|
/obj/item/toy/crossbow/tommygun
|
|
name = "tommy gun"
|
|
desc = "Looks almost like the real thing! Great for practicing Drive-bys"
|
|
icon_state = "tommy"
|
|
item_state = "tommy"
|
|
flags = FPRINT | TABLEPASS| CONDUCT
|
|
w_class = 1.0
|
|
attack_verb = list("struck", "hammered", "hit", "bashed")
|
|
bullets = 20.0
|
|
|
|
/obj/item/toy/crossbow/tommygun/attackby(obj/item/I as obj, mob/user as mob)
|
|
if(istype(I, /obj/item/toy/ammo/crossbow))
|
|
if(bullets <= 19)
|
|
user.drop_item()
|
|
del(I)
|
|
bullets++
|
|
user << "<span class='notice'>You load the foam dart into the tommy gun.</span>"
|
|
else
|
|
user << "<span class='danger'>It's already fully loaded.</span>"
|
|
|
|
/*
|
|
* Toy swords
|
|
*/
|
|
/obj/item/toy/sword
|
|
name = "toy sword"
|
|
desc = "A cheap, plastic replica of an energy sword. Realistic sounds! Ages 8 and up."
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "sword0"
|
|
item_state = "sword0"
|
|
var/active = 0.0
|
|
w_class = 2.0
|
|
flags = FPRINT | TABLEPASS | 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
|
|
|
|
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
|
|
|
|
/obj/item/toy/katana
|
|
name = "replica katana"
|
|
desc = "Woefully underpowered in D20."
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "katana"
|
|
item_state = "katana"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
slot_flags = SLOT_BELT | SLOT_BACK
|
|
force = 5
|
|
throwforce = 5
|
|
w_class = 3
|
|
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
|
|
hitsound = 'sound/weapons/bladeslice.ogg'
|
|
|
|
/*
|
|
* Crayons
|
|
*/
|
|
|
|
/obj/item/toy/crayon
|
|
name = "crayon"
|
|
desc = "A colourful crayon. Looks tasty. Mmmm..."
|
|
icon = 'icons/obj/crayons.dmi'
|
|
icon_state = "crayonred"
|
|
w_class = 1.0
|
|
attack_verb = list("attacked", "coloured")
|
|
var/colour = "#FF0000" //RGB
|
|
var/shadeColour = "#220000" //RGB
|
|
var/uses = 30 //0 for unlimited uses
|
|
var/instant = 0
|
|
var/colourName = "red" //for updateIcon purposes
|
|
|
|
suicide_act(mob/user)
|
|
viewers(user) << "<span class='suicide'>[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.</span>"
|
|
return (BRUTELOSS|OXYLOSS)
|
|
|
|
/*
|
|
* Snap pops
|
|
*/
|
|
/obj/item/toy/snappop
|
|
name = "snap pop"
|
|
desc = "Wow!"
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "snappop"
|
|
w_class = 1
|
|
|
|
throw_impact(atom/hit_atom)
|
|
..()
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/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)
|
|
del(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!"
|
|
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/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!")
|
|
playsound(src, 'sound/effects/snap.ogg', 50, 1)
|
|
del(src)
|
|
|
|
|
|
|
|
/*
|
|
* Mech prizes
|
|
*/
|
|
/obj/item/toy/prize
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "ripleytoy"
|
|
var/cooldown = 0
|
|
|
|
//all credit to skasi for toy mech fun ideas
|
|
/obj/item/toy/prize/attack_self(mob/user as mob)
|
|
if(cooldown < world.time - 8)
|
|
user << "<span class='notice'>You play with [src].</span>"
|
|
playsound(user, 'sound/mecha/mechstep.ogg', 20, 1)
|
|
cooldown = world.time
|
|
|
|
/obj/item/toy/prize/attack_hand(mob/user as mob)
|
|
if(loc == user)
|
|
if(cooldown < world.time - 8)
|
|
user << "<span class='notice'>You play with [src].</span>"
|
|
playsound(user, 'sound/mecha/mechturn.ogg', 20, 1)
|
|
cooldown = world.time
|
|
return
|
|
..()
|
|
|
|
/obj/item/toy/prize/ripley
|
|
name = "toy ripley"
|
|
desc = "Mini-Mecha action figure! Collect them all! 1/11."
|
|
|
|
/obj/item/toy/prize/fireripley
|
|
name = "toy firefighting ripley"
|
|
desc = "Mini-Mecha action figure! Collect them all! 2/11."
|
|
icon_state = "fireripleytoy"
|
|
|
|
/obj/item/toy/prize/deathripley
|
|
name = "toy deathsquad ripley"
|
|
desc = "Mini-Mecha action figure! Collect them all! 3/11."
|
|
icon_state = "deathripleytoy"
|
|
|
|
/obj/item/toy/prize/gygax
|
|
name = "toy gygax"
|
|
desc = "Mini-Mecha action figure! Collect them all! 4/11."
|
|
icon_state = "gygaxtoy"
|
|
|
|
|
|
/obj/item/toy/prize/durand
|
|
name = "toy durand"
|
|
desc = "Mini-Mecha action figure! Collect them all! 5/11."
|
|
icon_state = "durandprize"
|
|
|
|
/obj/item/toy/prize/honk
|
|
name = "toy H.O.N.K."
|
|
desc = "Mini-Mecha action figure! Collect them all! 6/11."
|
|
icon_state = "honkprize"
|
|
|
|
/obj/item/toy/prize/marauder
|
|
name = "toy marauder"
|
|
desc = "Mini-Mecha action figure! Collect them all! 7/11."
|
|
icon_state = "marauderprize"
|
|
|
|
/obj/item/toy/prize/seraph
|
|
name = "toy seraph"
|
|
desc = "Mini-Mecha action figure! Collect them all! 8/11."
|
|
icon_state = "seraphprize"
|
|
|
|
/obj/item/toy/prize/mauler
|
|
name = "toy mauler"
|
|
desc = "Mini-Mecha action figure! Collect them all! 9/11."
|
|
icon_state = "maulerprize"
|
|
|
|
/obj/item/toy/prize/odysseus
|
|
name = "toy odysseus"
|
|
desc = "Mini-Mecha action figure! Collect them all! 10/11."
|
|
icon_state = "odysseusprize"
|
|
|
|
/obj/item/toy/prize/phazon
|
|
name = "toy phazon"
|
|
desc = "Mini-Mecha action figure! Collect them all! 11/11."
|
|
icon_state = "phazonprize"
|
|
|
|
|
|
/obj/item/toy/katana
|
|
name = "replica katana"
|
|
desc = "Woefully underpowered in D20."
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "katana"
|
|
item_state = "katana"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
slot_flags = SLOT_BELT | SLOT_BACK
|
|
force = 5
|
|
throwforce = 5
|
|
w_class = 3
|
|
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
|
|
|
|
|
|
/*
|
|
|| A Deck of Cards for playing various games of chance ||
|
|
*/
|
|
|
|
|
|
|
|
obj/item/toy/cards
|
|
var/parentdeck = null
|
|
var/deckstyle = "nanotrasen"
|
|
var/card_hitsound = null
|
|
var/card_force = 0
|
|
var/card_throwforce = 0
|
|
var/card_throw_speed = 4
|
|
var/card_throw_range = 20
|
|
var/list/card_attack_verb = list("attacked")
|
|
|
|
obj/item/toy/cards/New()
|
|
..()
|
|
|
|
obj/item/toy/cards/proc/apply_card_vars(obj/item/toy/cards/newobj, obj/item/toy/cards/sourceobj) // Applies variables for supporting multiple types of card deck
|
|
if(!istype(sourceobj))
|
|
return
|
|
|
|
obj/item/toy/cards/deck
|
|
name = "deck of cards"
|
|
desc = "A deck of space-grade playing cards."
|
|
icon = 'icons/obj/toy.dmi'
|
|
deckstyle = "nanotrasen"
|
|
icon_state = "deck_nanotrasen_full"
|
|
w_class = 2.0
|
|
var/cooldown = 0
|
|
var/list/cards = list()
|
|
|
|
obj/item/toy/cards/deck/New()
|
|
..()
|
|
icon_state = "deck_[deckstyle]_full"
|
|
for(var/i = 2; i <= 10; i++)
|
|
cards += "[i] of Hearts"
|
|
cards += "[i] of Spades"
|
|
cards += "[i] of Clubs"
|
|
cards += "[i] of Diamonds"
|
|
cards += "King of Hearts"
|
|
cards += "King of Spades"
|
|
cards += "King of Clubs"
|
|
cards += "King of Diamonds"
|
|
cards += "Queen of Hearts"
|
|
cards += "Queen of Spades"
|
|
cards += "Queen of Clubs"
|
|
cards += "Queen of Diamonds"
|
|
cards += "Jack of Hearts"
|
|
cards += "Jack of Spades"
|
|
cards += "Jack of Clubs"
|
|
cards += "Jack of Diamonds"
|
|
cards += "Ace of Hearts"
|
|
cards += "Ace of Spades"
|
|
cards += "Ace of Clubs"
|
|
cards += "Ace of Diamonds"
|
|
|
|
|
|
obj/item/toy/cards/deck/attack_hand(mob/user as mob)
|
|
var/choice = null
|
|
if(cards.len == 0)
|
|
src.icon_state = "deck_[deckstyle]_empty"
|
|
user << "<span class='notice'>There are no more cards to draw.</span>"
|
|
return
|
|
var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc)
|
|
choice = cards[1]
|
|
H.cardname = choice
|
|
H.parentdeck = src
|
|
var/O = src
|
|
H.apply_card_vars(H,O)
|
|
src.cards -= choice
|
|
H.pickup(user)
|
|
user.put_in_active_hand(H)
|
|
src.visible_message("<span class='notice'>[user] draws a card from the deck.</span>", "<span class='notice'>You draw a card from the deck.</span>")
|
|
if(cards.len > 26)
|
|
src.icon_state = "deck_[deckstyle]_full"
|
|
else if(cards.len > 10)
|
|
src.icon_state = "deck_[deckstyle]_half"
|
|
else if(cards.len > 1)
|
|
src.icon_state = "deck_[deckstyle]_low"
|
|
|
|
obj/item/toy/cards/deck/attack_self(mob/user as mob)
|
|
if(cooldown < world.time - 50)
|
|
cards = shuffle(cards)
|
|
playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
|
|
user.visible_message("<span class='notice'>[user] shuffles the deck.</span>", "<span class='notice'>You shuffle the deck.</span>")
|
|
cooldown = world.time
|
|
|
|
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/user)
|
|
..()
|
|
if(istype(C))
|
|
if(C.parentdeck == src)
|
|
src.cards += C.cardname
|
|
user.u_equip(C)
|
|
user.visible_message("<span class='notice'>[user] adds a card to the bottom of the deck.</span>","<span class='notice'>You add the card to the bottom of the deck.</span>")
|
|
del(C)
|
|
else
|
|
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
|
if(cards.len > 26)
|
|
src.icon_state = "deck_[deckstyle]_full"
|
|
else if(cards.len > 10)
|
|
src.icon_state = "deck_[deckstyle]_half"
|
|
else if(cards.len > 1)
|
|
src.icon_state = "deck_[deckstyle]_low"
|
|
|
|
|
|
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user)
|
|
..()
|
|
if(istype(C))
|
|
if(C.parentdeck == src)
|
|
src.cards += C.currenthand
|
|
user.u_equip(C)
|
|
user.visible_message("<span class='notice'>[user] puts their hand of cards in the deck.</span>", "<span class='notice'>You put the hand of cards in the deck.</span>")
|
|
del(C)
|
|
else
|
|
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
|
if(cards.len > 26)
|
|
src.icon_state = "deck_[deckstyle]_full"
|
|
else if(cards.len > 10)
|
|
src.icon_state = "deck_[deckstyle]_half"
|
|
else if(cards.len > 1)
|
|
src.icon_state = "deck_[deckstyle]_low"
|
|
|
|
obj/item/toy/cards/deck/MouseDrop(atom/over_object)
|
|
var/mob/M = usr
|
|
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
|
|
return
|
|
if(Adjacent(usr))
|
|
if(over_object == M)
|
|
M.put_in_hands(src)
|
|
usr << "<span class='notice'>You pick up the deck.</span>"
|
|
|
|
else if(istype(over_object, /obj/screen))
|
|
switch(over_object.name)
|
|
if("r_hand")
|
|
M.u_equip(src)
|
|
M.put_in_r_hand(src)
|
|
usr << "<span class='notice'>You pick up the deck.</span>"
|
|
if("l_hand")
|
|
M.u_equip(src)
|
|
M.put_in_l_hand(src)
|
|
usr << "<span class='notice'>You pick up the deck.</span>"
|
|
else
|
|
usr<< "<span class='notice'>You can't reach it from here.</span>"
|
|
|
|
|
|
|
|
obj/item/toy/cards/cardhand
|
|
name = "hand of cards"
|
|
desc = "A number of cards not in a deck, customarily held in ones hand."
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "nanotrasen_hand2"
|
|
w_class = 1.0
|
|
var/list/currenthand = list()
|
|
var/choice = null
|
|
|
|
|
|
obj/item/toy/cards/cardhand/attack_self(mob/user as mob)
|
|
user.set_machine(src)
|
|
interact(user)
|
|
|
|
obj/item/toy/cards/cardhand/interact(mob/user)
|
|
var/dat = "You have:<BR>"
|
|
for(var/t in currenthand)
|
|
dat += "<A href='?src=\ref[src];pick=[t]'>A [t].</A><BR>"
|
|
dat += "Which card will you remove next?"
|
|
var/datum/browser/popup = new(user, "cardhand", "Hand of Cards", 400, 240)
|
|
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
|
popup.set_content(dat)
|
|
popup.open()
|
|
|
|
|
|
obj/item/toy/cards/cardhand/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
if(usr.stat || !ishuman(usr) || !usr.canmove)
|
|
return
|
|
var/mob/living/carbon/human/cardUser = usr
|
|
var/O = src
|
|
if(href_list["pick"])
|
|
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
|
|
C.parentdeck = src.parentdeck
|
|
C.cardname = choice
|
|
C.apply_card_vars(C,O)
|
|
C.pickup(cardUser)
|
|
cardUser.put_in_any_hand_if_possible(C)
|
|
cardUser.visible_message("<span class='notice'>[cardUser] draws a card from \his hand.</span>", "<span class='notice'>You take the [C.cardname] from your hand.</span>")
|
|
|
|
interact(cardUser)
|
|
if(src.currenthand.len < 3)
|
|
src.icon_state = "[deckstyle]_hand2"
|
|
else if(src.currenthand.len < 4)
|
|
src.icon_state = "[deckstyle]_hand3"
|
|
else if(src.currenthand.len < 5)
|
|
src.icon_state = "[deckstyle]_hand4"
|
|
if(src.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]
|
|
N.apply_card_vars(N,O)
|
|
cardUser.u_equip(src)
|
|
N.pickup(cardUser)
|
|
cardUser.put_in_any_hand_if_possible(N)
|
|
cardUser << "<span class='notice'>You also take [currenthand[1]] and hold it.</span>"
|
|
cardUser << browse(null, "window=cardhand")
|
|
del(src)
|
|
return
|
|
|
|
obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living/user)
|
|
if(istype(C))
|
|
if(C.parentdeck == src.parentdeck)
|
|
src.currenthand += C.cardname
|
|
user.u_equip(C)
|
|
user.visible_message("<span class='notice'>[user] adds a card to their hand.</span>", "<span class='notice'>You add the [C.cardname] to your hand.</span>")
|
|
interact(user)
|
|
if(currenthand.len > 4)
|
|
src.icon_state = "[deckstyle]_hand5"
|
|
else if(currenthand.len > 3)
|
|
src.icon_state = "[deckstyle]_hand4"
|
|
else if(currenthand.len > 2)
|
|
src.icon_state = "[deckstyle]_hand3"
|
|
del(C)
|
|
else
|
|
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
|
|
|
obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj,obj/item/toy/cards/sourceobj)
|
|
..()
|
|
newobj.deckstyle = sourceobj.deckstyle
|
|
newobj.icon_state = "[deckstyle]_hand2" // Another dumb hack, without this the hand is invisible (or has the default deckstyle) until another card is added.
|
|
newobj.card_hitsound = sourceobj.card_hitsound
|
|
newobj.card_force = sourceobj.card_force
|
|
newobj.card_throwforce = sourceobj.card_throwforce
|
|
newobj.card_throw_speed = sourceobj.card_throw_speed
|
|
newobj.card_throw_range = sourceobj.card_throw_range
|
|
newobj.card_attack_verb = sourceobj.card_attack_verb
|
|
|
|
|
|
obj/item/toy/cards/singlecard
|
|
name = "card"
|
|
desc = "a card"
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "singlecard_nanotrasen_down"
|
|
w_class = 1.0
|
|
var/cardname = null
|
|
var/flipped = 0
|
|
pixel_x = -5
|
|
|
|
|
|
obj/item/toy/cards/singlecard/examine()
|
|
set src in usr.contents
|
|
if(ishuman(usr))
|
|
var/mob/living/carbon/human/cardUser = usr
|
|
if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
|
|
cardUser.visible_message("<span class='notice'>[cardUser] checks \his card.</span>", "<span class='notice'>The card reads: [src.cardname]</span>")
|
|
else
|
|
cardUser << "<span class='notice'>You need to have the card in your hand to check it.</span>"
|
|
|
|
|
|
obj/item/toy/cards/singlecard/verb/Flip()
|
|
set name = "Flip Card"
|
|
set category = "Object"
|
|
set src in range(1)
|
|
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
|
|
return
|
|
if(!flipped)
|
|
src.flipped = 1
|
|
if (cardname)
|
|
src.icon_state = "sc_[cardname]_[deckstyle]"
|
|
src.name = src.cardname
|
|
else
|
|
src.icon_state = "sc_Ace of Spades_[deckstyle]"
|
|
src.name = "What Card"
|
|
src.pixel_x = 5
|
|
else if(flipped)
|
|
src.flipped = 0
|
|
src.icon_state = "singlecard_down_[deckstyle]"
|
|
src.name = "card"
|
|
src.pixel_x = -5
|
|
|
|
obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user)
|
|
if(istype(I, /obj/item/toy/cards/singlecard/))
|
|
var/obj/item/toy/cards/singlecard/C = I
|
|
if(C.parentdeck == src.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.parentdeck = C.parentdeck
|
|
H.apply_card_vars(H,C)
|
|
user.u_equip(C)
|
|
H.pickup(user)
|
|
user.put_in_active_hand(H)
|
|
user << "<span class='notice'>You combine the [C.cardname] and the [src.cardname] into a hand.</span>"
|
|
del(C)
|
|
del(src)
|
|
else
|
|
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
|
|
|
if(istype(I, /obj/item/toy/cards/cardhand/))
|
|
var/obj/item/toy/cards/cardhand/H = I
|
|
if(H.parentdeck == parentdeck)
|
|
H.currenthand += cardname
|
|
user.u_equip(src)
|
|
user.visible_message("<span class='notice'>[user] adds a card to \his hand.</span>", "<span class='notice'>You add the [cardname] to your hand.</span>")
|
|
H.interact(user)
|
|
if(H.currenthand.len > 4)
|
|
H.icon_state = "[deckstyle]_hand5"
|
|
else if(H.currenthand.len > 3)
|
|
H.icon_state = "[deckstyle]_hand4"
|
|
else if(H.currenthand.len > 2)
|
|
H.icon_state = "[deckstyle]_hand3"
|
|
del(src)
|
|
else
|
|
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
|
|
|
|
|
obj/item/toy/cards/singlecard/attack_self(mob/user)
|
|
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
|
|
return
|
|
Flip()
|
|
|
|
obj/item/toy/cards/singlecard/apply_card_vars(obj/item/toy/cards/singlecard/newobj,obj/item/toy/cards/sourceobj)
|
|
..()
|
|
newobj.deckstyle = sourceobj.deckstyle
|
|
newobj.icon_state = "singlecard_down_[deckstyle]" // Without this the card is invisible until flipped. It's an ugly hack, but it works.
|
|
newobj.card_hitsound = sourceobj.card_hitsound
|
|
newobj.hitsound = newobj.card_hitsound
|
|
newobj.card_force = sourceobj.card_force
|
|
newobj.force = newobj.card_force
|
|
newobj.card_throwforce = sourceobj.card_throwforce
|
|
newobj.throwforce = newobj.card_throwforce
|
|
newobj.card_throw_speed = sourceobj.card_throw_speed
|
|
newobj.throw_speed = newobj.card_throw_speed
|
|
newobj.card_throw_range = sourceobj.card_throw_range
|
|
newobj.throw_range = newobj.card_throw_range
|
|
newobj.card_attack_verb = sourceobj.card_attack_verb
|
|
newobj.attack_verb = newobj.card_attack_verb
|
|
|
|
|
|
/*
|
|
|| Syndicate playing cards, for pretending you're Gambit and playing poker for the nuke disk. ||
|
|
*/
|
|
|
|
obj/item/toy/cards/deck/syndicate
|
|
name = "suspicious looking deck of cards"
|
|
desc = "A deck of space-grade playing cards. They seem unusually rigid."
|
|
deckstyle = "syndicate"
|
|
card_hitsound = 'sound/weapons/bladeslice.ogg'
|
|
card_force = 15
|
|
card_throwforce = 15
|
|
card_throw_speed = 6
|
|
card_throw_range = 20
|
|
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
|
|
|
|
/*
|
|
|| Custom card decks ||
|
|
*/
|
|
obj/item/toy/cards/deck/black
|
|
deckstyle = "black"
|
|
|
|
obj/item/toy/cards/deck/syndicate/black
|
|
deckstyle = "black"
|
|
|
|
/obj/item/toy/nuke
|
|
name = "\improper Nuclear Fission Explosive toy"
|
|
desc = "A plastic model of a Nuclear Fission Explosive."
|
|
icon = 'icons/obj/toy.dmi'
|
|
icon_state = "nuketoyidle"
|
|
w_class = 2.0
|
|
var/cooldown = 0
|
|
|
|
/obj/item/toy/nuke/attack_self(mob/user)
|
|
if (cooldown < world.time)
|
|
cooldown = world.time + 3000 //5 minutes
|
|
user.visible_message("<span class='warning'>[user] presses a button on [src]</span>", "<span class='notice'>You activate [src], it plays a loud noise!</span>", "<span class='notice'>You hear the click of a button.</span>")
|
|
spawn(5) //gia said so
|
|
icon_state = "nuketoy"
|
|
playsound(src, 'sound/machines/Alarm.ogg', 100, 0, surround = 0)
|
|
sleep(135)
|
|
icon_state = "nuketoyidle"
|
|
|
|
/obj/item/weapon/toddler
|
|
icon_state = "toddler"
|
|
name = "toddler"
|
|
desc = "This baby looks almost real. Wait, did it just burp?"
|
|
force = 5
|
|
w_class = 4.0
|
|
slot_flags = SLOT_BACK
|