mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-29 15:08:34 +01:00
Merge branch 'master' into upstream-merge-8298
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
icon = 'icons/obj/apc_repair.dmi'
|
||||
icon_state = "apc_frame"
|
||||
refund_amt = 2
|
||||
build_wall_only = TRUE
|
||||
matter = list(MAT_STEEL = 100, MAT_GLASS = 30)
|
||||
|
||||
/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob)
|
||||
|
||||
@@ -9,8 +9,13 @@
|
||||
throw_range = 15
|
||||
throw_speed = 3
|
||||
|
||||
//matter = list(MAT_STEEL = 50,MAT_GLASS = 50)
|
||||
|
||||
//matter = list(MAT_STEEL = 50, MAT_GLASS = 50)
|
||||
|
||||
/obj/item/device/binoculars/attack_self(mob/user)
|
||||
zoom()
|
||||
|
||||
/obj/item/device/binoculars/spyglass
|
||||
name = "spyglass"
|
||||
desc = "It's a hand-held telescope, useful for star-gazing, peeping, and recon."
|
||||
icon_state = "spyglass"
|
||||
slot_flags = SLOT_BELT
|
||||
@@ -76,6 +76,10 @@
|
||||
// Clean up the simplemob
|
||||
ghostjoin = FALSE
|
||||
ghostjoin_icon()
|
||||
if(capture_caught)
|
||||
to_chat(src, "<span class='notice'>You are bound to [revivedby], follow their commands within reason and to the best of your abilities, and avoid betraying or abandoning them.</span><span class= warning> You are allied with [revivedby]. Do not attack anyone for no reason. Of course, you may do scenes as you like, but you must still respect preferences.</span>")
|
||||
visible_message("[src]'s eyes flicker with a curious intelligence.", runemessage = "looks around")
|
||||
return
|
||||
if(revivedby != "no one")
|
||||
to_chat(src, "<span class='notice'>Where once your life had been rough and scary, you have been assisted by [revivedby]. They seem to be the reason you are on your feet again... so perhaps you should help them out.</span> <span class= warning> Being as you were revived, you are allied with the station. Do not attack anyone unless they are threatening the one who revived you. And try to listen to the one who revived you within reason. Of course, you may do scenes as you like, but you must still respect preferences.</span>")
|
||||
visible_message("[src]'s eyes flicker with a curious intelligence.", runemessage = "looks around")
|
||||
@@ -95,6 +99,10 @@
|
||||
to_chat(D, "<span class='notice'>Sorry, someone else has already inhabited [src].</span>")
|
||||
return FALSE
|
||||
|
||||
if(capture_caught && !D.client.prefs.capture_crystal)
|
||||
to_chat(D, "<span class='notice'>Sorry, [src] is participating in capture mechanics, and your preferences do not allow for that.</span>")
|
||||
return FALSE
|
||||
|
||||
// Insert whatever ban checks you want here if we ever add simplemob bans
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -62,12 +62,12 @@
|
||||
|
||||
/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
|
||||
if (aiOverride)
|
||||
playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
|
||||
//playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
|
||||
return ..(freq, level)
|
||||
if(ishuman(src.loc))
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
if(H.l_ear == src || H.r_ear == src)
|
||||
playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
|
||||
//playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
|
||||
return ..(freq, level)
|
||||
return -1
|
||||
|
||||
|
||||
@@ -409,7 +409,7 @@ GLOBAL_LIST_BOILERPLATE(premade_tele_beacons, /obj/item/device/perfect_tele_beac
|
||||
if(confirm == "Eat it!")
|
||||
var/obj/belly/bellychoice = tgui_input_list(usr, "Which belly?","Select A Belly", L.vore_organs)
|
||||
if(bellychoice)
|
||||
user.visible_message("<span class='warning'>[user] is trying to stuff \the [src] into [user.gender == MALE ? "his" : user.gender == FEMALE ? "her" : "their"] [bellychoice]!</span>","<span class='notice'>You begin putting \the [src] into your [bellychoice]!</span>")
|
||||
user.visible_message("<span class='warning'>[user] is trying to stuff \the [src] into [user.gender == MALE ? "his" : user.gender == FEMALE ? "her" : "their"] [bellychoice.name]!</span>","<span class='notice'>You begin putting \the [src] into your [bellychoice.name]!</span>")
|
||||
if(do_after(user,5 SECONDS,src))
|
||||
user.unEquip(src)
|
||||
forceMove(bellychoice)
|
||||
|
||||
@@ -260,6 +260,17 @@
|
||||
new_desc = "A very retro APLU unit; didn't they retire these back in 2543?"
|
||||
new_icon = "ripley-old"
|
||||
allowed_types = list("ripley")
|
||||
var/showpilot = TRUE
|
||||
var/showpilot_lift = 5
|
||||
|
||||
/obj/item/device/kit/paint/ripley/customize(obj/mecha/M, mob/user)
|
||||
if(showpilot)
|
||||
M.show_pilot = TRUE
|
||||
M.pilot_lift = 5
|
||||
else
|
||||
M.show_pilot = FALSE
|
||||
M.pilot_lift = 0
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/kit/paint/ripley/death
|
||||
name = "\"Reaper\" APLU customisation kit"
|
||||
@@ -267,18 +278,21 @@
|
||||
new_desc = "A terrifying, grim power loader. Why do those clamps have spikes?"
|
||||
new_icon = "deathripley"
|
||||
allowed_types = list("ripley","firefighter")
|
||||
showpilot = FALSE
|
||||
|
||||
/obj/item/device/kit/paint/ripley/flames_red
|
||||
name = "\"Firestarter\" APLU customisation kit"
|
||||
new_name = "APLU \"Firestarter\""
|
||||
new_desc = "A standard APLU exosuit with stylish orange flame decals."
|
||||
new_icon = "ripley_flames_red"
|
||||
showpilot = FALSE
|
||||
|
||||
/obj/item/device/kit/paint/ripley/flames_blue
|
||||
name = "\"Burning Chrome\" APLU customisation kit"
|
||||
new_name = "APLU \"Burning Chrome\""
|
||||
new_desc = "A standard APLU exosuit with stylish blue flame decals."
|
||||
new_icon = "ripley_flames_blue"
|
||||
showpilot = FALSE
|
||||
|
||||
// Durand kits.
|
||||
/obj/item/device/kit/paint/durand
|
||||
|
||||
@@ -212,7 +212,11 @@
|
||||
|
||||
O.set_dir(user.dir)
|
||||
O.add_fingerprint(user)
|
||||
|
||||
//VOREStation Addition Start - Let's not store things that get crafted with materials like this, they won't spawn correctly when retrieved.
|
||||
if (isobj(O))
|
||||
var/obj/P = O
|
||||
P.persist_storable = FALSE
|
||||
//VOREStation Addition End
|
||||
if (istype(O, /obj/item/stack))
|
||||
var/obj/item/stack/S = O
|
||||
S.amount = produced
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Mech toys (previously labeled prizes, but that's unintuitive)
|
||||
* Mech toy combat
|
||||
*/
|
||||
|
||||
|
||||
// Mech battle special attack types.
|
||||
#define SPECIAL_ATTACK_HEAL 1
|
||||
#define SPECIAL_ATTACK_DAMAGE 2
|
||||
@@ -17,7 +17,7 @@
|
||||
icon_state = "ripleytoy"
|
||||
drop_sound = 'sound/mecha/mechstep.ogg'
|
||||
reach = 2 // So you can battle across the table!
|
||||
|
||||
|
||||
// Mech Battle Vars
|
||||
var/timer = 0 // Timer when it'll be off cooldown
|
||||
var/cooldown = 1.5 SECONDS // Cooldown between play sessions (and interactions)
|
||||
@@ -34,7 +34,7 @@
|
||||
var/special_attack_cooldown = 0 // Current cooldown of their special attack
|
||||
var/wins = 0 // This mech's win count in combat
|
||||
var/losses = 0 // ...And their loss count in combat
|
||||
|
||||
|
||||
/obj/item/toy/mecha/Initialize()
|
||||
. = ..()
|
||||
desc = "Mini-Mecha action figure! Collect them all! Attack your friends or another mech with one to initiate epic mech combat! [desc]."
|
||||
@@ -58,7 +58,7 @@
|
||||
return 0 //not in range and not telekinetic
|
||||
|
||||
/**
|
||||
* this proc combines "sleep" while also checking for if the battle should continue
|
||||
* this proc combines "sleep" while also checking for if the battle should continue
|
||||
*
|
||||
* this goes through some of the checks - the toys need to be next to each other to fight!
|
||||
* if it's player vs themself: They need to be able to "control" both mechs (either must be adjacent or using TK).
|
||||
@@ -112,7 +112,7 @@
|
||||
// If all that is good, then we can sleep peacefully.
|
||||
sleep(delay)
|
||||
return TRUE
|
||||
|
||||
|
||||
//all credit to skasi for toy mech fun ideas
|
||||
/obj/item/toy/mecha/attack_self(mob/user)
|
||||
if(timer < world.time)
|
||||
@@ -130,15 +130,15 @@
|
||||
attack_self(user)
|
||||
|
||||
/**
|
||||
* If you attack a mech with a mech, initiate combat between them
|
||||
* If you attack a mech with a mech, initiate combat between them
|
||||
*/
|
||||
/obj/item/toy/mecha/attackby(obj/item/user_toy, mob/living/user)
|
||||
if(istype(user_toy, /obj/item/toy/mecha))
|
||||
if(istype(user_toy, /obj/item/toy/mecha))
|
||||
var/obj/item/toy/mecha/M = user_toy
|
||||
if(check_battle_start(user, M))
|
||||
mecha_brawl(M, user)
|
||||
..()
|
||||
|
||||
|
||||
/**
|
||||
* Attack is called from the user's toy, aimed at target(another human), checking for target's toy.
|
||||
*/
|
||||
@@ -241,9 +241,9 @@
|
||||
|
||||
sleep(1 SECONDS)
|
||||
//--THE BATTLE BEGINS--
|
||||
while(combat_health > 0 && attacker.combat_health > 0 && battle_length < MAX_BATTLE_LENGTH)
|
||||
while(combat_health > 0 && attacker.combat_health > 0 && battle_length < MAX_BATTLE_LENGTH)
|
||||
if(!combat_sleep(0.5 SECONDS, attacker, attacker_controller, opponent)) //combat_sleep checks everything we need to have checked for combat to continue
|
||||
break
|
||||
break
|
||||
|
||||
//before we do anything - deal with charged attacks
|
||||
if(special_attack_charged)
|
||||
@@ -269,7 +269,7 @@
|
||||
attacker.special_attack_charged = TRUE
|
||||
attacker_controller.visible_message("<span class='danger'> [attacker] begins charging its special attack!! </span>", \
|
||||
"<span class='danger'> You begin charging [attacker]'s special attack! </span>")
|
||||
else //just attack
|
||||
else //just attack
|
||||
attacker.SpinAnimation(5, 0)
|
||||
playsound(attacker, 'sound/mecha/mechstep.ogg', 30, TRUE)
|
||||
combat_health--
|
||||
@@ -322,7 +322,7 @@
|
||||
special_attack_charged = TRUE
|
||||
src_controller.visible_message("<span class='danger'> [src] begins charging its special attack!! </span>", \
|
||||
"<span class='danger'> You begin charging [src]'s special attack! </span>")
|
||||
else //just attack
|
||||
else //just attack
|
||||
SpinAnimation(5, 0)
|
||||
playsound(src, 'sound/mecha/mechstep.ogg', 30, TRUE)
|
||||
attacker.combat_health--
|
||||
@@ -333,12 +333,12 @@
|
||||
attacker.combat_health--
|
||||
playsound(attacker, 'sound/effects/meteorimpact.ogg', 20, TRUE)
|
||||
src_controller.visible_message("<span class='boldwarning'> ...and lands a CRIPPLING BLOW! </span>", \
|
||||
"<span class='boldwarning'> ...and you land a CRIPPLING blow on [attacker]! </span>", null)
|
||||
"<span class='boldwarning'> ...and you land a CRIPPLING blow on [attacker]! </span>", null)
|
||||
else
|
||||
attacker_controller.visible_message("<span class='notice'> [src] and [attacker] stand around awkwardly.</span>", \
|
||||
"<span class='notice'> You don't know what to do next.</span>")
|
||||
"<span class='notice'> You don't know what to do next.</span>")
|
||||
|
||||
battle_length++
|
||||
battle_length++
|
||||
sleep(0.5 SECONDS)
|
||||
|
||||
/// Lines chosen for the winning mech
|
||||
@@ -347,7 +347,7 @@
|
||||
if(attacker.combat_health <= 0 && combat_health <= 0) //both lose
|
||||
playsound(src, 'sound/machines/warning-buzzer.ogg', 20, TRUE)
|
||||
attacker_controller.visible_message("<span class='boldnotice'> MUTUALLY ASSURED DESTRUCTION!! [src] and [attacker] both end up destroyed!</span>", \
|
||||
"<span class='boldnotice'> Both [src] and [attacker] are destroyed!</span>")
|
||||
"<span class='boldnotice'> Both [src] and [attacker] are destroyed!</span>")
|
||||
else if(attacker.combat_health <= 0) //src wins
|
||||
wins++
|
||||
attacker.losses++
|
||||
@@ -359,7 +359,7 @@
|
||||
"<span class='notice'> You raise up [src] victoriously over [attacker]!</span>")
|
||||
else if (combat_health <= 0) //attacker wins
|
||||
attacker.wins++
|
||||
losses++
|
||||
losses++
|
||||
playsound(src, 'sound/effects/light_flicker.ogg', 20, TRUE)
|
||||
src_controller.visible_message("<span class='notice'> [src] collapses!</span>", \
|
||||
"<span class='notice'> [src] collapses!</span>", null)
|
||||
@@ -374,7 +374,7 @@
|
||||
in_combat = FALSE
|
||||
attacker.in_combat = FALSE
|
||||
|
||||
combat_health = max_combat_health
|
||||
combat_health = max_combat_health
|
||||
attacker.combat_health = attacker.max_combat_health
|
||||
|
||||
return
|
||||
@@ -382,49 +382,49 @@
|
||||
/**
|
||||
* This proc checks if a battle can be initiated between src and attacker.
|
||||
*
|
||||
* Both SRC and attacker (if attacker is included) timers are checked if they're on cooldown, and
|
||||
* Both SRC and attacker (if attacker is included) timers are checked if they're on cooldown, and
|
||||
* both SRC and attacker (if attacker is included) are checked if they are in combat already.
|
||||
* If any of the above are true, the proc returns FALSE and sends a message to user (and target, if included) otherwise, it returns TRUE
|
||||
* Arguments:
|
||||
* * user: the user who is initiating the battle
|
||||
* * attacker: optional arg for checking two mechs at once
|
||||
* * attacker: optional arg for checking two mechs at once
|
||||
* * target: optional arg used in Mech PvP battles (if used, attacker is target's toy)
|
||||
*/
|
||||
/obj/item/toy/mecha/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mecha/attacker, mob/living/carbon/target)
|
||||
var/datum/gender/T
|
||||
/obj/item/toy/mecha/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mecha/attacker, mob/living/carbon/target)
|
||||
var/datum/gender/T
|
||||
if(target)
|
||||
T = gender_datums[target.get_visible_gender()] // Doing this because Polaris Code has shitty gender datums and it's clunkier than FUCK.
|
||||
if(attacker && attacker.in_combat)
|
||||
to_chat(user, "<span class='notice'>[target ? T.His : "Your" ] [attacker.name] is in combat.</span>")
|
||||
if(target)
|
||||
if(target)
|
||||
to_chat(target, "<span class='notice'>Your [attacker.name] is in combat.</span>")
|
||||
return FALSE
|
||||
return FALSE
|
||||
if(in_combat)
|
||||
to_chat(user, "<span class='notice'>Your [name] is in combat.</span>")
|
||||
if(target)
|
||||
if(target)
|
||||
to_chat(target, "<span class='notice'>[T.His] [name] is in combat.</span>")
|
||||
return FALSE
|
||||
return FALSE
|
||||
if(attacker && attacker.timer > world.time)
|
||||
to_chat(user, "<span class='notice'>[target?T.His : "Your" ] [attacker.name] isn't ready for battle.</span>")
|
||||
if(target)
|
||||
if(target)
|
||||
to_chat(target, "<span class='notice'>Your [attacker.name] isn't ready for battle.</span>")
|
||||
return FALSE
|
||||
return FALSE
|
||||
if(timer > world.time)
|
||||
to_chat(user, "<span class='notice'>Your [name] isn't ready for battle.</span>")
|
||||
if(target)
|
||||
if(target)
|
||||
to_chat(target, "<span class='notice'>[T.His] [name] isn't ready for battle.</span>")
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Processes any special attack moves that happen in the battle (called in the mechaBattle proc).
|
||||
* Processes any special attack moves that happen in the battle (called in the mechaBattle proc).
|
||||
*
|
||||
* Makes the toy shout their special attack cry and updates its cooldown. Then, does the special attack.
|
||||
* Arguments:
|
||||
* * victim - the toy being hit by the special move
|
||||
*/
|
||||
/obj/item/toy/mecha/proc/special_attack_move(obj/item/toy/mecha/victim)
|
||||
/obj/item/toy/mecha/proc/special_attack_move(obj/item/toy/mecha/victim)
|
||||
visible_message(special_attack_cry + "!!")
|
||||
|
||||
special_attack_charged = FALSE
|
||||
@@ -447,15 +447,15 @@
|
||||
visible_message("I FORGOT MY SPECIAL ATTACK...")
|
||||
|
||||
/**
|
||||
* Base proc for 'other' special attack moves.
|
||||
* Base proc for 'other' special attack moves.
|
||||
*
|
||||
* This one is only for inheritance, each mech with an 'other' type move has their procs below.
|
||||
* This one is only for inheritance, each mech with an 'other' type move has their procs below.
|
||||
* Arguments:
|
||||
* * victim - the toy being hit by the super special move (doesn't necessarily need to be used)
|
||||
*/
|
||||
/obj/item/toy/mecha/proc/super_special_attack(obj/item/toy/mecha/victim)
|
||||
/obj/item/toy/mecha/proc/super_special_attack(obj/item/toy/mecha/victim)
|
||||
visible_message("<span class='notice'> [src] does a cool flip.</span>")
|
||||
|
||||
|
||||
/obj/random/mech_toy
|
||||
name = "Random Mech Toy"
|
||||
desc = "This is a random mech toy."
|
||||
@@ -488,8 +488,8 @@
|
||||
special_attack_type = SPECIAL_ATTACK_OTHER
|
||||
special_attack_type_message = "instantly destroys the opposing mech if its health is less than this mech's health."
|
||||
special_attack_cry = "KILLER CLAMP"
|
||||
|
||||
/obj/item/toy/mecha/deathripley/super_special_attack(obj/item/toy/mecha/victim)
|
||||
|
||||
/obj/item/toy/mecha/deathripley/super_special_attack(obj/item/toy/mecha/victim)
|
||||
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 20, TRUE)
|
||||
if(victim.combat_health < combat_health) // Instantly kills the other mech if it's health is below our's.
|
||||
visible_message("EXECUTE!!")
|
||||
@@ -522,7 +522,7 @@
|
||||
special_attack_type_message = "puts the opposing mech's special move on cooldown and heals this mech."
|
||||
special_attack_cry = "MEGA HORN"
|
||||
|
||||
/obj/item/toy/mecha/honk/super_special_attack(obj/item/toy/mecha/victim)
|
||||
/obj/item/toy/mecha/honk/super_special_attack(obj/item/toy/mecha/victim)
|
||||
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 20, TRUE)
|
||||
victim.special_attack_cooldown += 3 // Adds cooldown to the other mech and gives a minor self heal
|
||||
combat_health++
|
||||
@@ -577,7 +577,7 @@
|
||||
special_attack_type_message = "has a lower cooldown than normal special moves, increases the opponent's cooldown, and deals damage."
|
||||
special_attack_cry = "*wave"
|
||||
|
||||
/obj/item/toy/mecha/reticence/super_special_attack(obj/item/toy/mecha/victim)
|
||||
/obj/item/toy/mecha/reticence/super_special_attack(obj/item/toy/mecha/victim)
|
||||
special_attack_cooldown-- //Has a lower cooldown...
|
||||
victim.special_attack_cooldown++ //and increases the opponent's cooldown by 1...
|
||||
victim.combat_health-- //and some free damage.
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
* Balloons
|
||||
* Fake telebeacon
|
||||
* Fake singularity
|
||||
* Toy gun
|
||||
* Toy crossbow
|
||||
* Toy swords
|
||||
* Toy bosun's whistle
|
||||
* Snap pops
|
||||
@@ -146,127 +144,6 @@
|
||||
icon = 'icons/obj/singularity.dmi'
|
||||
icon_state = "singularity_s1"
|
||||
|
||||
/*
|
||||
* 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_icons = list(
|
||||
icon_l_hand = 'icons/mob/items/lefthand_guns.dmi',
|
||||
icon_r_hand = 'icons/mob/items/righthand_guns.dmi',
|
||||
)
|
||||
slot_flags = SLOT_HOLSTER
|
||||
w_class = ITEMSIZE_SMALL
|
||||
attack_verb = list("attacked", "struck", "hit")
|
||||
var/bullets = 5
|
||||
drop_sound = 'sound/items/drop/gun.ogg'
|
||||
|
||||
/obj/item/toy/crossbow/examine(mob/user)
|
||||
. = ..()
|
||||
if(bullets && get_dist(user, src) <= 2)
|
||||
. += "<span class='notice'>It is loaded with [bullets] foam darts!</span>"
|
||||
|
||||
/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/toy/ammo/crossbow))
|
||||
if(bullets <= 4)
|
||||
user.drop_item()
|
||||
qdel(I)
|
||||
bullets++
|
||||
to_chat(user, "<span class='notice'>You load the foam dart into the crossbow.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>It's already fully loaded.</span>")
|
||||
|
||||
|
||||
/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(src, '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
|
||||
for(var/mob/O in viewers(world.view, D))
|
||||
O.show_message(text("<span class='warning'>\The [] was hit by the foam dart!</span>", M), 1)
|
||||
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)
|
||||
qdel(D)
|
||||
|
||||
return
|
||||
else if (bullets == 0)
|
||||
user.Weaken(5)
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message(text("<span class='warning'>\The [] realized they were out of ammo and starting scrounging for some!</span>", user), 1)
|
||||
|
||||
|
||||
/obj/item/toy/crossbow/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'>\The [] casually lines up a shot with []'s head and pulls the trigger!</span>", user, M), 1, "<span class='warning'>You hear the sound of foam against skull</span>", 2)
|
||||
O.show_message(text("<span class='warning'>\The [] was hit in the head by the foam dart!</span>", M), 1)
|
||||
|
||||
playsound(src, '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'>\The [] 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!</span>", user, M), 1, "<span class='warning'>You hear someone fall</span>", 2)
|
||||
user.Weaken(5)
|
||||
return
|
||||
|
||||
/obj/item/toy/ammo/crossbow
|
||||
name = "foam dart"
|
||||
desc = "It's nerf or nothing! Ages 8 and up."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "foamdart"
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_EARS
|
||||
drop_sound = 'sound/items/drop/food.ogg'
|
||||
|
||||
/obj/effect/foam_dart_dummy
|
||||
name = ""
|
||||
desc = ""
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "null"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
|
||||
/*
|
||||
* Toy swords
|
||||
*/
|
||||
@@ -395,7 +272,6 @@
|
||||
/*
|
||||
* Bosun's whistle
|
||||
*/
|
||||
|
||||
/obj/item/toy/bosunwhistle
|
||||
name = "bosun's whistle"
|
||||
desc = "A genuine Admiral Krush Bosun's Whistle, for the aspiring ship's captain! Suitable for ages 8 and up, do not swallow."
|
||||
@@ -946,7 +822,7 @@
|
||||
else
|
||||
searching = FALSE
|
||||
|
||||
if(world.time - last_message <= 1 SECOND)
|
||||
if(world.time - last_message <= 15 SECONDS)
|
||||
return
|
||||
if(user.a_intent == I_HELP)
|
||||
user.visible_message("<span class='notice'><b>\The [user]</b> hugs [src]!</span>","<span class='notice'>You hug [src]!</span>")
|
||||
@@ -1527,7 +1403,7 @@
|
||||
name = "black king"
|
||||
desc = "A black king chess piece."
|
||||
description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
|
||||
icon_state = "black_king"
|
||||
icon_state = "black_king"
|
||||
|
||||
/// Balloon structures
|
||||
|
||||
|
||||
@@ -1,9 +1,44 @@
|
||||
/* Virgo Toys!
|
||||
* Contains:
|
||||
* Mistletoe
|
||||
* Plushies
|
||||
* Pet rocks
|
||||
* Chew toys
|
||||
* Cat toys
|
||||
* Fake flash
|
||||
* Big red button
|
||||
* Garden gnome
|
||||
* Toy AI
|
||||
* Hand buzzer
|
||||
* Toy cuffs
|
||||
* Toy nuke
|
||||
* Toy gibber
|
||||
* Toy xeno
|
||||
* Russian revolver
|
||||
* Trick revolver
|
||||
* Toy chainsaw
|
||||
* Random miniature spawner
|
||||
* Snake popper
|
||||
* Professor Who universal ID
|
||||
* Professor Who sonic driver
|
||||
* Action figures
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Mistletoe
|
||||
*/
|
||||
/obj/item/toy/mistletoe
|
||||
name = "mistletoe"
|
||||
desc = "You are supposed to kiss someone under these"
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "mistletoe"
|
||||
|
||||
/*
|
||||
* Plushies
|
||||
*/
|
||||
// HEY FUTURE PLUSHIE CODERS: IF YOU'RE ADDING A SNOWFLAKE PLUSH ITEM USE PATH /obj/item/toy/plushie/fluff
|
||||
// the loadout entry shouldn't be able to grab those if everything goes right
|
||||
/obj/item/toy/plushie/lizardplushie
|
||||
name = "lizard plushie"
|
||||
desc = "An adorable stuffed toy that resembles a lizardperson."
|
||||
@@ -101,38 +136,6 @@
|
||||
/obj/item/toy/plushie/vox/proc/cooldownreset()
|
||||
cooldown = 0
|
||||
|
||||
/*
|
||||
* 4/9/21 *
|
||||
* IPC Plush
|
||||
* Toaster plush
|
||||
* Snake plush
|
||||
* Cube plush
|
||||
* Pip plush
|
||||
* Moth plush
|
||||
* Crab plush
|
||||
* Possum plush
|
||||
* Goose plush
|
||||
* White mouse plush
|
||||
* Pet rock
|
||||
* Pet rock (m)
|
||||
* Pet rock (f)
|
||||
* Chew toys
|
||||
* Cat toy * 2
|
||||
* Toy flash
|
||||
* Toy button
|
||||
* Gnome
|
||||
* Toy AI
|
||||
* Buzzer ring
|
||||
* Fake handcuffs
|
||||
* Nuke toy
|
||||
* Toy gibber
|
||||
* Toy xeno
|
||||
* Fake gun * 2
|
||||
* Toy chainsaw
|
||||
* Random tabletop miniature spawner
|
||||
* snake popper
|
||||
*/
|
||||
|
||||
/obj/item/toy/plushie/ipc
|
||||
name = "IPC plushie"
|
||||
desc = "A pleasing soft-toy of a monitor-headed robot. Toaster functionality included."
|
||||
@@ -172,7 +175,6 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/toy/plushie/ipc/attack_self(mob/user as mob)
|
||||
if(!cooldown)
|
||||
playsound(user, 'sound/machines/ping.ogg', 10, 0)
|
||||
@@ -274,7 +276,9 @@
|
||||
|
||||
/obj/item/toy/plushie/goose
|
||||
name = "goose plushie"
|
||||
desc = "An adorable likeness of a terrifying beast. It's simple existance chills you to the bone and compells you to hide any loose objects it might steal."
|
||||
desc = "An adorable likeness of a terrifying beast. \
|
||||
It's simple existance chills you to the bone and \
|
||||
compells you to hide any loose objects it might steal."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "goose"
|
||||
attack_verb = list("honked")
|
||||
@@ -284,9 +288,54 @@
|
||||
icon_state = "mouse"
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
|
||||
/obj/item/toy/plushie/susred
|
||||
name = "red spaceman plushie"
|
||||
desc = "A suspicious looking red spaceman plushie. Why does it smell like the vents?"
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "sus_red"
|
||||
attack_verb = list("stabbed", "slashed")
|
||||
|
||||
/obj/item/toy/plushie/ipc/toaster/attack_self(mob/user as mob)
|
||||
if(!cooldown)
|
||||
playsound(user, 'sound/weapons/slice.ogg', 10, 0)
|
||||
src.visible_message("<span class='danger'>Stab!</span>")
|
||||
cooldown = 1
|
||||
addtimer(CALLBACK(src, .proc/cooldownreset), 50)
|
||||
return ..()
|
||||
|
||||
/obj/item/toy/plushie/susblue
|
||||
name = "blue spaceman plushie"
|
||||
desc = "A dapper looking blue spaceman plushie. Looks very intuitive."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "sus_blue"
|
||||
|
||||
/obj/item/toy/plushie/suswhite
|
||||
name = "white spaceman plushie"
|
||||
desc = "A whiny looking white spaceman plushie. Looks like it could cry at any moment."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "sus_white"
|
||||
|
||||
/obj/item/toy/plushie/bigcat
|
||||
name = "big cat plushie"
|
||||
desc = "A big, fluffy looking cat that just looks very huggable."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "big_cat"
|
||||
|
||||
/obj/item/toy/plushie/basset
|
||||
name = "basset plushie"
|
||||
desc = "A sleepy looking basset hound plushie."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "basset"
|
||||
|
||||
/*
|
||||
* Pet rocks
|
||||
*/
|
||||
/obj/item/toy/rock
|
||||
name = "pet rock"
|
||||
desc = "A stuffed version of the classic pet. The soft ones were made after kids kept throwing them at each other. It has a small piece of soft plastic that you can draw on if you wanted."
|
||||
desc = "A stuffed version of the classic pet. \
|
||||
The soft ones were made after kids kept throwing \
|
||||
them at each other. It has a small piece of soft \
|
||||
plastic that you can draw on if you wanted."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "rock"
|
||||
attack_verb = list("grug'd", "unga'd")
|
||||
@@ -307,6 +356,9 @@
|
||||
to_chat(user, "You draw a face on the rock and pull aside the plastic slightly, revealing a small pink bow.")
|
||||
return
|
||||
|
||||
/*
|
||||
* Chew toys
|
||||
*/
|
||||
/obj/item/toy/chewtoy
|
||||
name = "chew toy"
|
||||
desc = "A red hard-rubber chew toy shaped like a bone. Perfect for your dog! You wouldn't want to chew on it, right?"
|
||||
@@ -330,6 +382,9 @@
|
||||
playsound(loc, 'sound/items/drop/plushie.ogg', 50, 1)
|
||||
user.visible_message("<span class='notice'><b>\The [user]</b> gnaws on [src]!</span>","<span class='notice'>You gnaw on [src]!</span>")
|
||||
|
||||
/*
|
||||
* Cat toys
|
||||
*/
|
||||
/obj/item/toy/cat_toy
|
||||
name = "toy mouse"
|
||||
desc = "A colorful toy mouse!"
|
||||
@@ -349,6 +404,9 @@
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
|
||||
)
|
||||
|
||||
/*
|
||||
* Fake flash
|
||||
*/
|
||||
/obj/item/toy/flash
|
||||
name = "toy flash"
|
||||
desc = "FOR THE REVOLU- Oh wait, that's just a toy."
|
||||
@@ -374,6 +432,9 @@
|
||||
/obj/item/toy/flash/proc/cooldownreset()
|
||||
cooldown = 0
|
||||
|
||||
/*
|
||||
* Big red button
|
||||
*/
|
||||
/obj/item/toy/redbutton
|
||||
name = "big red button"
|
||||
desc = "A big, plastic red button. Reads 'From HonkCo Pranks?' on the back."
|
||||
@@ -394,12 +455,18 @@
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Nothing happens.</span>")
|
||||
|
||||
/*
|
||||
* Garden gnome
|
||||
*/
|
||||
/obj/item/toy/gnome
|
||||
name = "garden gnome"
|
||||
desc = "It's a gnome, not a gnelf. Made of weak ceramic."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "gnome"
|
||||
|
||||
/*
|
||||
* Toy AI
|
||||
*/
|
||||
/obj/item/toy/AI
|
||||
name = "toy AI"
|
||||
desc = "A little toy model AI core with real law announcing action!"
|
||||
@@ -434,6 +501,9 @@
|
||||
/obj/item/toy/AI/proc/cooldownreset()
|
||||
cooldown = 0
|
||||
|
||||
/*
|
||||
* Hand buzzer
|
||||
*/
|
||||
/obj/item/clothing/gloves/ring/buzzer/toy
|
||||
name = "steel ring"
|
||||
desc = "Torus shaped finger decoration. It has a small piece of metal on the palm-side."
|
||||
@@ -460,6 +530,9 @@
|
||||
|
||||
return 0
|
||||
|
||||
/*
|
||||
* Toy cuffs
|
||||
*/
|
||||
/obj/item/weapon/handcuffs/fake
|
||||
name = "plastic handcuffs"
|
||||
desc = "Use this to keep plastic prisoners in line."
|
||||
@@ -484,6 +557,9 @@
|
||||
foldable = null
|
||||
can_hold = list(/obj/item/weapon/handcuffs/fake, /obj/item/weapon/handcuffs/legcuffs/fake)
|
||||
|
||||
/*
|
||||
* Toy nuke
|
||||
*/
|
||||
/obj/item/toy/nuke
|
||||
name = "\improper Nuclear Fission Explosive toy"
|
||||
desc = "A plastic model of a Nuclear Fission Explosive."
|
||||
@@ -510,6 +586,9 @@
|
||||
if(istype(I, /obj/item/weapon/disk/nuclear))
|
||||
to_chat(user, "<span class='alert'>Nice try. Put that disk back where it belongs.</span>")
|
||||
|
||||
/*
|
||||
* Toy gibber
|
||||
*/
|
||||
/obj/item/toy/minigibber
|
||||
name = "miniature gibber"
|
||||
desc = "A miniature recreation of NanoTrasen's famous meat grinder. Equipped with a special interlock that prevents insertion of organic material."
|
||||
@@ -547,6 +626,9 @@
|
||||
|
||||
else ..()
|
||||
|
||||
/*
|
||||
* Toy xeno
|
||||
*/
|
||||
/obj/item/toy/toy_xeno
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "xeno"
|
||||
@@ -571,6 +653,9 @@
|
||||
to_chat(user, "<span class='warning'>The string on [src] hasn't rewound all the way!</span>")
|
||||
return
|
||||
|
||||
/*
|
||||
* Russian revolver
|
||||
*/
|
||||
/obj/item/toy/russian_revolver
|
||||
name = "russian revolver"
|
||||
desc = "For fun and games!"
|
||||
@@ -641,6 +726,9 @@
|
||||
to_chat(user, "<span class='warning'>[src] needs to be reloaded.</span>")
|
||||
return FALSE
|
||||
|
||||
/*
|
||||
* Trick revolver
|
||||
*/
|
||||
/obj/item/toy/russian_revolver/trick_revolver
|
||||
name = "\improper .357 revolver"
|
||||
desc = "A suspicious revolver. Uses .357 ammo."
|
||||
@@ -668,6 +756,9 @@
|
||||
sleep(5)
|
||||
icon_state = "[initial(icon_state)]"
|
||||
|
||||
/*
|
||||
* Toy chainsaw
|
||||
*/
|
||||
/obj/item/toy/chainsaw
|
||||
name = "Toy Chainsaw"
|
||||
desc = "A toy chainsaw with a rubber edge. Ages 8 and up"
|
||||
@@ -690,6 +781,9 @@
|
||||
/obj/item/toy/chainsaw/proc/cooldownreset()
|
||||
cooldown = 0
|
||||
|
||||
/*
|
||||
* Random miniature spawner
|
||||
*/
|
||||
/obj/random/miniature
|
||||
name = "Random miniature"
|
||||
desc = "This is a random miniature."
|
||||
@@ -699,6 +793,9 @@
|
||||
/obj/random/miniature/item_to_spawn()
|
||||
return pick(typesof(/obj/item/toy/character))
|
||||
|
||||
/*
|
||||
* Snake popper
|
||||
*/
|
||||
/obj/item/toy/snake_popper
|
||||
name = "bread tube"
|
||||
desc = "Bread in a tube. Chewy...and surprisingly tasty."
|
||||
@@ -775,3 +872,93 @@
|
||||
real = 2
|
||||
to_chat(user, "<span class='notice'>You short out the bluespace refill system of [src].</span>")
|
||||
|
||||
/*
|
||||
* Professor Who universal ID
|
||||
*/
|
||||
/obj/item/clothing/under/universalid
|
||||
name = "identification card"
|
||||
desc = "A novelty identification card based on Professor Who's Universal ID."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "universal_id"
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_ID | SLOT_EARS
|
||||
body_parts_covered = 0
|
||||
equip_sound = null
|
||||
|
||||
sprite_sheets = null
|
||||
|
||||
item_state = "golem" //This is dumb and hacky but was here when I got here.
|
||||
worn_state = "golem" //It's basically just a coincidentally black iconstate in the file.
|
||||
|
||||
/*
|
||||
* Professor Who sonic driver
|
||||
*/
|
||||
/obj/item/weapon/tool/screwdriver/sdriver
|
||||
name = "sonic driver"
|
||||
desc = "A novelty screwdriver that uses tiny magnets to manipulate screws."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "sonic_driver"
|
||||
item_state = "screwdriver_black"
|
||||
usesound = 'sound/items/sonic_driver.ogg'
|
||||
toolspeed = 1
|
||||
random_color = FALSE
|
||||
|
||||
/*
|
||||
* Professor Who time capsule
|
||||
*/
|
||||
/obj/item/weapon/storage/box/timecap
|
||||
name = "action time capsule"
|
||||
desc = "A toy recreation of the Time Capsule from Professor Who. Can hold up to two action figures."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "time_cap"
|
||||
can_hold = list(/obj/item/toy/figure)
|
||||
max_w_class = ITEMSIZE_TINY
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 2
|
||||
use_sound = 'sound/machines/click.ogg'
|
||||
drop_sound = 'sound/items/drop/accessory.ogg'
|
||||
pickup_sound = 'sound/items/pickup/accessory.ogg'
|
||||
|
||||
/*
|
||||
* Action figures
|
||||
*/
|
||||
/obj/item/toy/figure/ranger
|
||||
name = "Space Ranger action figure"
|
||||
desc = "A \"Space Life\" brand Space Ranger action figure."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "ranger"
|
||||
toysay = "To the Fontier and beyond!"
|
||||
|
||||
/obj/item/toy/figure/leadbandit
|
||||
name = "Bandit Leader action figure"
|
||||
desc = "A \"Space Life\" brand Bandit Leader action figure."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "bandit_lead"
|
||||
toysay = "Give us yer bluespace crystals!"
|
||||
|
||||
/obj/item/toy/figure/bandit
|
||||
name = "Bandit action figure"
|
||||
desc = "A \"Space Life\" brand Bandit action figure."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "bandit"
|
||||
toysay = "Stick em' up!"
|
||||
|
||||
/obj/item/toy/figure/abe
|
||||
name = "Action Abe action figure"
|
||||
desc = "A \"Space Life\" brand Action Abe action figure."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "action_abe"
|
||||
toysay = "Four score and seven decades ago..."
|
||||
|
||||
/obj/item/toy/figure/profwho
|
||||
name = "Professor Who action figure"
|
||||
desc = "A \"Space Life\" brand Professor Who action figure."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "prof_who"
|
||||
toysay = "Smells like... bad wolf..."
|
||||
|
||||
/obj/item/toy/figure/prisoner
|
||||
name = "prisoner action figure"
|
||||
desc = "A \"Space Life\" brand prisoner action figure."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "prisoner"
|
||||
toysay = "I did not hit her! I did not!"
|
||||
|
||||
@@ -0,0 +1,850 @@
|
||||
/obj/item/capture_crystal
|
||||
name = "capture crystal"
|
||||
desc = "A silent, unassuming crystal in what appears to be some kind of steel housing."
|
||||
icon = 'icons/obj/capture_crystal_vr.dmi'
|
||||
icon_state = "inactive"
|
||||
drop_sound = 'sound/items/drop/ring.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ring.ogg'
|
||||
throwforce = 0
|
||||
force = 0
|
||||
action_button_name = "Command"
|
||||
|
||||
var/active = FALSE //Is it set up?
|
||||
var/mob/living/owner //Reference to the owner
|
||||
var/mob/living/bound_mob //Reference to our bound mob
|
||||
var/spawn_mob_type //The kind of mob an inactive crystal will try to spawn when activated
|
||||
var/activate_cooldown = 30 SECONDS //How long do we wait between unleashing and recalling
|
||||
var/last_activate //Automatically set by things that try to move the bound mob or capture things
|
||||
var/empty_icon = "empty"
|
||||
var/full_icon = "full"
|
||||
var/capture_chance_modifier = 1 //So we can have special subtypes with different capture rates!
|
||||
|
||||
/obj/item/capture_crystal/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
//Let's make sure we clean up our references and things if the crystal goes away (such as when it's digested)
|
||||
/obj/item/capture_crystal/Destroy()
|
||||
if(bound_mob)
|
||||
if(bound_mob in contents)
|
||||
unleash()
|
||||
to_chat(bound_mob, "<span class='notice'>You feel like yourself again. You are no longer under the influence of \the [src]'s command.</span>")
|
||||
UnregisterSignal(bound_mob, COMSIG_PARENT_QDELETING)
|
||||
bound_mob.capture_caught = FALSE
|
||||
bound_mob = null
|
||||
if(owner)
|
||||
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/obj/item/capture_crystal/examine(user)
|
||||
. = ..()
|
||||
if(user == owner && bound_mob)
|
||||
. += "<span class = 'notice'>[bound_mob]'s crystal</span>"
|
||||
if(isanimal(bound_mob))
|
||||
. += "<span class = 'notice'>[bound_mob.health / bound_mob.maxHealth * 100]%</span>"
|
||||
if(bound_mob.ooc_notes)
|
||||
. += "<span class = 'deptradio'>OOC Notes:</span> <a href='?src=\ref[bound_mob];ooc_notes=1'>\[View\]</a>"
|
||||
. += "<span class='deptradio'><a href='?src=\ref[bound_mob];vore_prefs=1'>\[Mechanical Vore Preferences\]</a></span>"
|
||||
|
||||
//Command! This lets the owner toggle hostile on AI controlled mobs, or send a silent command message to your bound mob, wherever they may be.
|
||||
/obj/item/capture_crystal/ui_action_click()
|
||||
if(!ismob(loc))
|
||||
return
|
||||
var/mob/living/M = src.loc
|
||||
if(M != owner)
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... It does not respond to your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(!bound_mob)
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... There is nothing to command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(isanimal(bound_mob) && !bound_mob.client)
|
||||
if(!isnull(bound_mob.get_AI_stance()))
|
||||
var/datum/ai_holder/AI = bound_mob.ai_holder
|
||||
AI.hostile = !AI.hostile
|
||||
if(!AI.hostile)
|
||||
AI.set_stance(STANCE_IDLE)
|
||||
to_chat(M, span("notice", "\The [bound_mob] is now [AI.hostile ? "hostile" : "passive"]."))
|
||||
log_admin("[key_name_admin(M)] set [bound_mob] to [AI.hostile].")
|
||||
else if(bound_mob.client)
|
||||
var/transmit_msg = tgui_input_text(usr, "What is your command?", "Command")
|
||||
if(length(transmit_msg) >= MAX_MESSAGE_LEN)
|
||||
to_chat(M, "<span class='danger'>Your message was TOO LONG!:[transmit_msg]</span>")
|
||||
return
|
||||
transmit_msg = sanitize(transmit_msg, max_length = MAX_MESSAGE_LEN)
|
||||
if(isnull(transmit_msg))
|
||||
to_chat(M, "<span class='notice'>You decided against it.</span>")
|
||||
return
|
||||
to_chat(bound_mob, "<span class='notice'>\The [owner] commands, '[transmit_msg]'</span>")
|
||||
to_chat(M, "<span class='notice'>Your command has been transmitted, '[transmit_msg]'</span>")
|
||||
log_admin("[key_name_admin(M)] sent the command, '[transmit_msg]' to [bound_mob].")
|
||||
else
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... \The [bound_mob] is unresponsive.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
|
||||
//Lets the owner get AI controlled bound mobs to follow them, or tells player controlled mobs to follow them.
|
||||
/obj/item/capture_crystal/verb/follow_owner()
|
||||
set name = "Toggle Follow"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!ismob(loc))
|
||||
return
|
||||
var/mob/living/M = src.loc
|
||||
if(M != owner)
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... It does not respond to your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(bound_mob.stat != CONSCIOUS)
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... \The [bound_mob] is not able to hear your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(bound_mob.client)
|
||||
to_chat(bound_mob, "<span class='notice'>\The [owner] wishes for you to follow them.</span>")
|
||||
else if(bound_mob in contents)
|
||||
if(!bound_mob.ai_holder)
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... \The [bound_mob] is not able to follow your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
var/datum/ai_holder/AI = bound_mob.ai_holder
|
||||
if(AI.leader)
|
||||
to_chat(M, "<span class='notice'>\The [src] chimes~ \The [bound_mob] stopped following [AI.leader].</span>")
|
||||
AI.lose_follow(AI.leader)
|
||||
else
|
||||
AI.set_follow(M)
|
||||
to_chat(M, "<span class='notice'>\The [src] chimes~ \The [bound_mob] started following following [AI.leader].</span>")
|
||||
else if(!(bound_mob in view(M)))
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... \The [bound_mob] is not able to hear your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
if(!bound_mob.ai_holder)
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... \The [bound_mob] is not able to follow your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
var/datum/ai_holder/AI = bound_mob.ai_holder
|
||||
if(AI.leader)
|
||||
to_chat(M, "<span class='notice'>\The [src] chimes~ \The [bound_mob] stopped following [AI.leader].</span>")
|
||||
AI.lose_follow(AI.leader)
|
||||
else
|
||||
AI.set_follow(M)
|
||||
to_chat(M, "<span class='notice'>\The [src] chimes~ \The [bound_mob] started following following [AI.leader].</span>")
|
||||
|
||||
//Don't really want people 'haha funny' capturing and releasing one another willy nilly. So! If you wanna release someone, you gotta destroy the thingy.
|
||||
//(Which is consistent with how it works with digestion anyway.)
|
||||
/obj/item/capture_crystal/verb/destroy_crystal()
|
||||
set name = "Destroy Crystal"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!ismob(loc))
|
||||
return
|
||||
var/mob/living/M = src.loc
|
||||
if(M != owner)
|
||||
to_chat(M, "<span class='notice'>\The [src] is too hard for you to break.</span>")
|
||||
else
|
||||
M.visible_message("\The [M] crushes \the [src] into dust...", "\The [src] cracks and disintegrates in your hand.")
|
||||
qdel(src)
|
||||
|
||||
//If you catch something/someone and want to give it to someone else though, that's fine.
|
||||
/obj/item/capture_crystal/verb/release_ownership()
|
||||
set name = "Release Ownership"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!ismob(loc))
|
||||
return
|
||||
var/mob/living/M = src.loc
|
||||
if(M != owner)
|
||||
to_chat(M, "<span class='notice'>\The [src] emits an unpleasant tone... It does not respond to your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else
|
||||
M.visible_message("\The [src] flickers in \the [M]'s hand and emits a little tone.", "\The [src] flickers in your hand and emits a little tone.")
|
||||
playsound(src, 'sound/effects/capture-crystal-out.ogg', 75, 1, -1)
|
||||
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
|
||||
owner = null
|
||||
|
||||
//Let's make inviting ghosts be an option you can do instead of an automatic thing!
|
||||
/obj/item/capture_crystal/verb/invite_ghost()
|
||||
set name = "Enhance (Toggle Ghost Join)"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!ismob(loc))
|
||||
return
|
||||
var/mob/living/U = src.loc
|
||||
if(!bound_mob)
|
||||
to_chat(U, "<span class='notice'>\The [src] emits an unpleasant tone... There is nothing to enhance.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
else if(U != owner)
|
||||
to_chat(U, "<span class='notice'>\The [src] emits an unpleasant tone... It does not respond to your command.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
else if(bound_mob.client || !isanimal(bound_mob))
|
||||
to_chat(U, "<span class='notice'>\The [src] emits an unpleasant tone... \The [bound_mob] is not eligable for enhancement.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1)
|
||||
return //Need to type cast the mob so it can detect ghostjoin
|
||||
var/mob/living/simple_mob/M = bound_mob
|
||||
if(M.ghostjoin)
|
||||
M.ghostjoin = FALSE
|
||||
to_chat(U, "<span class='notice'>\The [bound_mob] is no longer eligable to be joined by ghosts.</span>")
|
||||
else if(tgui_alert(U, "Do you want to offer your [bound_mob] up to ghosts to play as? There is no way undo this once a ghost takes over.", "Invite ghosts?",list("No","Yes")) == "Yes")
|
||||
M.ghostjoin = TRUE
|
||||
to_chat(U, "<span class='notice'>\The [bound_mob] is now eligable to be joined by ghosts. It will need to be out of the crystal to be able to be joined.</span>")
|
||||
else
|
||||
to_chat(U, "<span class='notice'>You decided against it.</span>")
|
||||
|
||||
/obj/item/capture_crystal/update_icon()
|
||||
. = ..()
|
||||
if(spawn_mob_type)
|
||||
icon_state = full_icon
|
||||
else if(!bound_mob)
|
||||
icon_state = "inactive"
|
||||
else if(bound_mob in contents)
|
||||
icon_state = full_icon
|
||||
else
|
||||
icon_state = empty_icon
|
||||
if(!cooldown_check())
|
||||
icon_state = "[icon_state]-busy"
|
||||
spawn(activate_cooldown) //If it's busy then we want to wait a bit to fix the sprite after the cooldown is done.
|
||||
update_icon()
|
||||
|
||||
/obj/item/capture_crystal/proc/cooldown_check()
|
||||
if(world.time < last_activate + activate_cooldown)
|
||||
return FALSE
|
||||
else return TRUE
|
||||
|
||||
/obj/item/capture_crystal/attack(mob/living/M, mob/living/user)
|
||||
if(bound_mob)
|
||||
if(!bound_mob.devourable) //Don't eat if prefs are bad
|
||||
return
|
||||
if(user.zone_sel.selecting == "mouth") //Click while targetting the mouth and you eat/feed the stored mob to whoever you clicked on
|
||||
if(bound_mob in contents)
|
||||
user.visible_message("\The [user] moves \the [src] to [M]'s [M.vore_selected]...")
|
||||
M.perform_the_nom(M, bound_mob, M, M.vore_selected)
|
||||
else if(M == user) //You don't have a mob, you ponder the orb instead of trying to capture yourself
|
||||
user.visible_message("\The [user] ponders \the [src]...", "You ponder \the [src]...")
|
||||
else if (cooldown_check()) //Try to capture someone without throwing
|
||||
user.visible_message("\The [user] taps \the [M] with \the [src].")
|
||||
activate(user, M)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] emits an unpleasant tone... It is not ready yet.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
|
||||
//Tries to unleash or recall your stored mob
|
||||
/obj/item/capture_crystal/attack_self(mob/living/user)
|
||||
if(!cooldown_check())
|
||||
to_chat(user, "<span class='notice'>\The [src] emits an unpleasant tone... It is not ready yet.</span>")
|
||||
if(bound_mob)
|
||||
playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1)
|
||||
else
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(user == bound_mob) //You can't recall yourself
|
||||
to_chat(user, "<span class='notice'>\The [src] emits an unpleasant tone... It does not activate for you.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(!active)
|
||||
activate(user)
|
||||
else
|
||||
determine_action(user)
|
||||
|
||||
//Make it so the crystal knows if its mob references get deleted to make sure things get cleaned up
|
||||
/obj/item/capture_crystal/proc/knowyoursignals(mob/living/M, mob/living/U)
|
||||
RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/mob_was_deleted, TRUE)
|
||||
RegisterSignal(U, COMSIG_PARENT_QDELETING, .proc/owner_was_deleted, TRUE)
|
||||
|
||||
//The basic capture command does most of the registration work.
|
||||
/obj/item/capture_crystal/proc/capture(mob/living/M, mob/living/U)
|
||||
if(!M.capture_crystal || M.capture_caught)
|
||||
to_chat(U, "<span class='warning'>This creature is not suitable for capture.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
knowyoursignals(M, U)
|
||||
owner = U
|
||||
if(isanimal(M))
|
||||
var/mob/living/simple_mob/S = M
|
||||
S.revivedby = U.name
|
||||
if(!bound_mob)
|
||||
bound_mob = M
|
||||
bound_mob.capture_caught = TRUE
|
||||
persist_storable = FALSE
|
||||
desc = "A glowing crystal in what appears to be some kind of steel housing."
|
||||
|
||||
//Determines the capture chance! So you can't capture AI mobs if they're perfectly healthy and all that
|
||||
/obj/item/capture_crystal/proc/capture_chance(mob/living/M, user)
|
||||
if(capture_chance_modifier >= 100) //Master crystal always work
|
||||
return 100
|
||||
var/capture_chance = ((1 - (M.health / M.maxHealth)) * 100) //Inverted health percent! 100% = 0%
|
||||
//So I don't know how this works but here's a kind of explanation
|
||||
//Basic chance + ((Mob's max health - minimum calculated health) / (Max allowed health - Min allowed health)*(Chance at Max allowed health - Chance at minimum allowed health)
|
||||
capture_chance += 35 + ((M.maxHealth - 5)/ (1000-5)*(-100 - 35))
|
||||
//Basically! Mobs over 1000 max health will be unable to be caught without using status effects.
|
||||
//Thanks Aronai!
|
||||
var/effect_count = 0 //This will give you a smol chance to capture if you have applied status effects, even if the chance would ordinarily be <0
|
||||
if(M.stat == UNCONSCIOUS)
|
||||
capture_chance += 0.1
|
||||
effect_count += 1
|
||||
else if(M.stat == CONSCIOUS)
|
||||
capture_chance *= 0.9
|
||||
else
|
||||
capture_chance = 0
|
||||
if(M.weakened) //Haha you fall down
|
||||
capture_chance += 0.1
|
||||
effect_count += 1
|
||||
if(M.stunned) //What's the matter???
|
||||
capture_chance += 0.1
|
||||
effect_count += 1
|
||||
if(M.on_fire) //AAAAAAAA
|
||||
capture_chance += 0.1
|
||||
effect_count += 1
|
||||
if(M.paralysis) //Oh noooo
|
||||
capture_chance += 0.1
|
||||
effect_count += 1
|
||||
if(M.ai_holder.stance == STANCE_IDLE) //SNEAK ATTACK???
|
||||
capture_chance += 0.1
|
||||
effect_count += 1
|
||||
|
||||
capture_chance *= capture_chance_modifier
|
||||
|
||||
if(capture_chance <= 0)
|
||||
capture_chance = 0 + effect_count
|
||||
if(capture_chance <= 0)
|
||||
capture_chance = 0
|
||||
to_chat(user, "<span class='notice'>There's no chance... It needs to be weaker.</span>")
|
||||
|
||||
last_activate = world.time
|
||||
log_admin("[user] threw a capture crystal at [M] and got [capture_chance]% chance to catch.")
|
||||
return capture_chance
|
||||
|
||||
//Handles checking relevent bans, preferences, and asking the player if they want to be caught
|
||||
/obj/item/capture_crystal/proc/capture_player(mob/living/M, mob/living/U)
|
||||
if(jobban_isbanned(M, "GhostRoles"))
|
||||
to_chat(U, "<span class='warning'>This creature is not suitable for capture.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(!M.capture_crystal || M.capture_caught)
|
||||
to_chat(U, "<span class='warning'>This creature is not suitable for capture.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(tgui_alert(M, "Would you like to be caught by in [src] by [U]? You will be bound to their will.", "Become Caught",list("No","Yes")) == "Yes")
|
||||
if(tgui_alert(M, "Are you really sure? The only way to undo this is to OOC escape while you're in the crystal.", "Become Caught", list("No","Yes")) == "Yes")
|
||||
log_admin("[key_name(M)] has agreed to become caught by [key_name(U)].")
|
||||
capture(M, U)
|
||||
recall(U)
|
||||
return
|
||||
to_chat(U, "<span class='warning'>This creature is too strong willed to be captured.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
|
||||
//The clean up procs!
|
||||
/obj/item/capture_crystal/proc/mob_was_deleted()
|
||||
UnregisterSignal(bound_mob, COMSIG_PARENT_QDELETING)
|
||||
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
|
||||
bound_mob.capture_caught = FALSE
|
||||
bound_mob = null
|
||||
owner = null
|
||||
active = FALSE
|
||||
persist_storable = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/item/capture_crystal/proc/owner_was_deleted()
|
||||
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
|
||||
owner = null
|
||||
active = FALSE
|
||||
update_icon()
|
||||
|
||||
//If the crystal hasn't been set up, it does this
|
||||
/obj/item/capture_crystal/proc/activate(mob/living/user, target)
|
||||
if(!cooldown_check()) //Are we ready to do things yet?
|
||||
to_chat(thrower, "<span class='notice'>\The [src] clicks unsatisfyingly... It is not ready yet.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
if(spawn_mob_type && !bound_mob) //We don't already have a mob, but we know what kind of mob we want
|
||||
bound_mob = new spawn_mob_type(src) //Well let's spawn it then!
|
||||
bound_mob.faction = user.faction
|
||||
spawn_mob_type = null
|
||||
capture(bound_mob, user)
|
||||
if(bound_mob) //We have a mob! Let's finish setting up.
|
||||
user.visible_message("\The [src] clicks, and then emits a small chime.", "\The [src] grows warm in your hand, something inside is awake.")
|
||||
active = TRUE
|
||||
if(!owner) //Do we have an owner? It's pretty unlikely that this would ever happen! But it happens, let's claim the crystal.
|
||||
owner = user
|
||||
if(isanimal(bound_mob))
|
||||
var/mob/living/simple_mob/S = bound_mob
|
||||
S.revivedby = user.name
|
||||
determine_action(user, target)
|
||||
return
|
||||
else if(isliving(target)) //So we don't have a mob, let's try to claim one! Is the target a mob?
|
||||
var/mob/living/M = target
|
||||
last_activate = world.time
|
||||
if(M.capture_caught) //Can't capture things that were already caught.
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
to_chat(user, "<span class='notice'>\The [src] clicks unsatisfyingly... \The [M] is already under someone else's control.</span>")
|
||||
return
|
||||
else if(M.stat == DEAD) //Is it dead? We can't influence dead things.
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
to_chat(user, "<span class='notice'>\The [src] clicks unsatisfyingly... \The [M] is not in a state to be captured.</span>")
|
||||
return
|
||||
else if(M.client) //Is it player controlled?
|
||||
capture_player(M, user) //We have to do things a little differently if so.
|
||||
return
|
||||
else if(!isanimal(M)) //So it's not player controlled, but it's also not a simplemob?
|
||||
to_chat(user, "<span class='warning'>This creature is not suitable for capture.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
var/mob/living/simple_mob/S = M
|
||||
if(!S.ai_holder) //We don't really want to capture simplemobs that don't have an AI
|
||||
to_chat(user, "<span class='warning'>This creature is not suitable for capture.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(prob(capture_chance(S, user))) //OKAY! So we have an NPC simplemob with an AI, let's calculate its capture chance! It varies based on the mob's condition.
|
||||
capture(S, user) //We did it! Woo! We capture it!
|
||||
user.visible_message("\The [src] clicks, and then emits a small chime.", "Alright! \The [S] was caught!")
|
||||
recall(user)
|
||||
active = TRUE
|
||||
else //Shoot, it didn't work and now it's mad!!!
|
||||
S.ai_holder.go_wake()
|
||||
S.ai_holder.target = user
|
||||
S.ai_holder.track_target_position()
|
||||
S.ai_holder.set_stance(STANCE_FIGHT)
|
||||
user.visible_message("\The [src] bonks into \the [S], angering it!")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
to_chat(user, "<span class='notice'>\The [src] clicks unsatisfyingly.</span>")
|
||||
update_icon()
|
||||
return
|
||||
//The target is not a mob, so let's not do anything.
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
to_chat(user, "<span class='notice'>\The [src] clicks unsatisfyingly.</span>")
|
||||
|
||||
//We're using the crystal, but what will it do?
|
||||
/obj/item/capture_crystal/proc/determine_action(mob/living/U, T)
|
||||
if(!cooldown_check()) //Are we ready yet?
|
||||
to_chat(thrower, "<span class='notice'>\The [src] clicks unsatisfyingly... It is not ready yet.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return //No
|
||||
if(bound_mob in contents) //Do we have our mob?
|
||||
if(T)
|
||||
unleash(U, T) //Yes, let's let it out!
|
||||
else
|
||||
unleash(U)
|
||||
else if (bound_mob) //Do we HAVE a mob?
|
||||
recall(U) //Yes, let's try to put it back in the crystal
|
||||
else //No we don't have a mob, let's reset the crystal.
|
||||
to_chat(U, "<span class='notice'>\The [src] clicks unsatisfyingly.</span>")
|
||||
active = FALSE
|
||||
update_icon()
|
||||
owner = null
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
|
||||
//Let's try to call our mob back!
|
||||
/obj/item/capture_crystal/proc/recall(mob/living/user)
|
||||
if(bound_mob in view(user)) //We can only recall it if we can see it
|
||||
var/turf/turfmemory = get_turf(bound_mob)
|
||||
if(isanimal(bound_mob))
|
||||
var/mob/living/simple_mob/M = bound_mob
|
||||
M.ai_holder.go_sleep() //AI doesn't need to think when it's in the crystal
|
||||
bound_mob.forceMove(src)
|
||||
last_activate = world.time
|
||||
bound_mob.visible_message("\The [user]'s [src] flashes, disappearing [bound_mob] in an instant!!!", "\The [src] pulls you back into confinement in a flash of light!!!")
|
||||
animate_action(turfmemory)
|
||||
playsound(src, 'sound/effects/capture-crystal-in.ogg', 75, 1, -1)
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] clicks and emits a small, unpleasant tone. \The [bound_mob] cannot be recalled.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
|
||||
//Let's let our mob out!
|
||||
/obj/item/capture_crystal/proc/unleash(mob/living/user, atom/target)
|
||||
if(!user && !target) //We got thrown but we're not sure who did it, let's go to where the crystal is
|
||||
bound_mob.forceMove(src.drop_location())
|
||||
return
|
||||
if(!target) //We know who wants to let us out, but they didn't say where, so let's drop us on them
|
||||
bound_mob.forceMove(user.drop_location())
|
||||
else //We got thrown! Let's go where we got thrown
|
||||
bound_mob.forceMove(target.drop_location())
|
||||
last_activate = world.time
|
||||
if(isanimal(bound_mob))
|
||||
var/mob/living/simple_mob/M = bound_mob
|
||||
M.ai_holder.go_wake() //Okay it's time to do work, let's wake up!
|
||||
bound_mob.faction = owner.faction //Let's make sure we aren't hostile to our owner or their friends
|
||||
bound_mob.visible_message("\The [user]'s [src] flashes, \the [bound_mob] appears in an instant!!!", "The world around you rematerialize as you are unleashed from the [src] next to \the [user]. You feel a strong compulsion to enact \the [owner]'s will.")
|
||||
animate_action(get_turf(bound_mob))
|
||||
playsound(src, 'sound/effects/capture-crystal-out.ogg', 75, 1, -1)
|
||||
update_icon()
|
||||
|
||||
//Let's make a flashy sparkle when someone appears or disappears!
|
||||
/obj/item/capture_crystal/proc/animate_action(atom/thing)
|
||||
var/image/coolanimation = image('icons/obj/capture_crystal_vr.dmi', null, "animation")
|
||||
coolanimation.plane = PLANE_LIGHTING_ABOVE
|
||||
thing.overlays += coolanimation
|
||||
sleep(11)
|
||||
thing.overlays -= coolanimation
|
||||
|
||||
//IF the crystal somehow ends up in a tummy and digesting with a bound mob who doesn't want to be eaten, let's move them to the ground
|
||||
/obj/item/capture_crystal/digest_act(var/atom/movable/item_storage = null)
|
||||
if(bound_mob in contents && !bound_mob.devourable)
|
||||
bound_mob.forceMove(src.drop_location())
|
||||
return ..()
|
||||
|
||||
//We got thrown! Let's figure out what to do
|
||||
/obj/item/capture_crystal/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, datum/callback/callback)
|
||||
. = ..()
|
||||
if(target == bound_mob && thrower != bound_mob) //We got thrown at our bound mob (and weren't thrown by the bound mob) let's ignore the cooldown and just put them back in
|
||||
recall(thrower)
|
||||
else if(!cooldown_check()) //OTHERWISE let's obey the cooldown
|
||||
to_chat(thrower, "<span class='notice'>\The [src] emits an soft tone... It is not ready yet.</span>")
|
||||
if(bound_mob)
|
||||
playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1)
|
||||
else
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(!active) //The ball isn't set up, let's try to set it up.
|
||||
if(isliving(target)) //We're hitting a mob, let's try to capture it.
|
||||
sleep(10)
|
||||
activate(thrower, target)
|
||||
return
|
||||
sleep(10)
|
||||
activate(thrower, src)
|
||||
else if(!bound_mob) //We hit something else, and we don't have a mob, so we can't really do anything!
|
||||
to_chat(thrower, "<span class='notice'>\The [src] clicks unpleasantly...</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
else if(bound_mob in contents) //We have our mob! Let's try to let it out.
|
||||
sleep(10)
|
||||
unleash(thrower, src)
|
||||
update_icon()
|
||||
else //Our mob isn't here, we can't do anything.
|
||||
to_chat(thrower, "<span class='notice'>\The [src] clicks unpleasantly...</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
|
||||
/obj/item/capture_crystal/basic
|
||||
|
||||
/obj/item/capture_crystal/great
|
||||
name = "great capture crystal"
|
||||
capture_chance_modifier = 1.5
|
||||
|
||||
/obj/item/capture_crystal/ultra
|
||||
name = "ultra capture crystal"
|
||||
capture_chance_modifier = 2
|
||||
|
||||
/obj/item/capture_crystal/master
|
||||
name = "master capture crystal"
|
||||
capture_chance_modifier = 100
|
||||
|
||||
/obj/item/capture_crystal/cass
|
||||
spawn_mob_type = /mob/living/simple_mob/vore/woof/cass
|
||||
/obj/item/capture_crystal/adg
|
||||
spawn_mob_type = /mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
|
||||
/obj/item/capture_crystal/bigdragon
|
||||
spawn_mob_type = /mob/living/simple_mob/vore/bigdragon
|
||||
/obj/item/capture_crystal/bigdragon/friendly
|
||||
spawn_mob_type = /mob/living/simple_mob/vore/bigdragon/friendly
|
||||
/obj/item/capture_crystal/teppi
|
||||
spawn_mob_type = /mob/living/simple_mob/vore/alienanimals/teppi
|
||||
/obj/item/capture_crystal/broodmother
|
||||
spawn_mob_type = /mob/living/simple_mob/animal/giant_spider/broodmother
|
||||
/obj/item/capture_crystal/skeleton
|
||||
spawn_mob_type = /mob/living/simple_mob/vore/alienanimals/skeleton
|
||||
/obj/item/capture_crystal/dustjumper
|
||||
spawn_mob_type = /mob/living/simple_mob/vore/alienanimals/dustjumper
|
||||
|
||||
/obj/item/capture_crystal/random
|
||||
var/static/list/possible_mob_types = list(
|
||||
list(/mob/living/simple_mob/animal/goat),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/passive/bird,
|
||||
/mob/living/simple_mob/animal/passive/bird/azure_tit,
|
||||
/mob/living/simple_mob/animal/passive/bird/black_bird,
|
||||
/mob/living/simple_mob/animal/passive/bird/european_robin,
|
||||
/mob/living/simple_mob/animal/passive/bird/goldcrest,
|
||||
/mob/living/simple_mob/animal/passive/bird/ringneck_dove,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/kea,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/white_caique,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/passive/cat,
|
||||
/mob/living/simple_mob/animal/passive/cat/black
|
||||
),
|
||||
list(/mob/living/simple_mob/animal/passive/chick),
|
||||
list(/mob/living/simple_mob/animal/passive/cow),
|
||||
list(/mob/living/simple_mob/animal/passive/dog/brittany),
|
||||
list(/mob/living/simple_mob/animal/passive/dog/corgi),
|
||||
list(/mob/living/simple_mob/animal/passive/dog/tamaskan),
|
||||
list(/mob/living/simple_mob/animal/passive/fox),
|
||||
list(/mob/living/simple_mob/animal/passive/hare),
|
||||
list(/mob/living/simple_mob/animal/passive/lizard),
|
||||
list(/mob/living/simple_mob/animal/passive/mouse),
|
||||
list(/mob/living/simple_mob/animal/passive/mouse/jerboa),
|
||||
list(/mob/living/simple_mob/animal/passive/opossum),
|
||||
list(/mob/living/simple_mob/animal/passive/pillbug),
|
||||
list(/mob/living/simple_mob/animal/passive/snake),
|
||||
list(/mob/living/simple_mob/animal/passive/tindalos),
|
||||
list(/mob/living/simple_mob/animal/passive/yithian),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/wolf,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf
|
||||
),
|
||||
list(/mob/living/simple_mob/vore/rabbit),
|
||||
list(/mob/living/simple_mob/vore/redpanda),
|
||||
list(/mob/living/simple_mob/vore/woof),
|
||||
list(/mob/living/simple_mob/vore/fennec),
|
||||
list(/mob/living/simple_mob/vore/fennix),
|
||||
list(/mob/living/simple_mob/vore/hippo),
|
||||
list(/mob/living/simple_mob/vore/horse),
|
||||
list(/mob/living/simple_mob/vore/bee),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/space/bear,
|
||||
/mob/living/simple_mob/animal/space/bear/brown
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/otie/feral,
|
||||
/mob/living/simple_mob/otie/feral/chubby,
|
||||
/mob/living/simple_mob/otie/red,
|
||||
/mob/living/simple_mob/otie/red/chubby
|
||||
),
|
||||
list(/mob/living/simple_mob/animal/sif/diyaab),
|
||||
list(/mob/living/simple_mob/animal/sif/duck),
|
||||
list(/mob/living/simple_mob/animal/sif/frostfly),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/sif/glitterfly =50,
|
||||
/mob/living/simple_mob/animal/sif/glitterfly/rare = 1
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/sif/kururak = 10,
|
||||
/mob/living/simple_mob/animal/sif/kururak/leader = 1,
|
||||
/mob/living/simple_mob/animal/sif/kururak/hibernate = 2,
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/sif/sakimm = 10,
|
||||
/mob/living/simple_mob/animal/sif/sakimm/intelligent = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/animal/sif/savik) = 5,
|
||||
list(
|
||||
/mob/living/simple_mob/animal/sif/shantak = 10,
|
||||
/mob/living/simple_mob/animal/sif/shantak/leader = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/animal/sif/siffet),
|
||||
list(/mob/living/simple_mob/animal/sif/tymisian),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/giant_spider/nurse = 10,
|
||||
/mob/living/simple_mob/animal/giant_spider/electric = 5,
|
||||
/mob/living/simple_mob/animal/giant_spider/frost = 5,
|
||||
/mob/living/simple_mob/animal/giant_spider/hunter = 10,
|
||||
/mob/living/simple_mob/animal/giant_spider/ion = 5,
|
||||
/mob/living/simple_mob/animal/giant_spider/lurker = 10,
|
||||
/mob/living/simple_mob/animal/giant_spider/pepper = 10,
|
||||
/mob/living/simple_mob/animal/giant_spider/phorogenic = 10,
|
||||
/mob/living/simple_mob/animal/giant_spider/thermic = 5,
|
||||
/mob/living/simple_mob/animal/giant_spider/tunneler = 10,
|
||||
/mob/living/simple_mob/animal/giant_spider/webslinger = 5,
|
||||
/mob/living/simple_mob/animal/giant_spider/broodmother = 1),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/wolf = 10,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf = 5,
|
||||
/mob/living/simple_mob/vore/greatwolf = 1,
|
||||
/mob/living/simple_mob/vore/greatwolf/black = 1,
|
||||
/mob/living/simple_mob/vore/greatwolf/grey = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/creature/strong),
|
||||
list(/mob/living/simple_mob/faithless/strong),
|
||||
list(/mob/living/simple_mob/animal/goat),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/sif/shantak/leader = 1,
|
||||
/mob/living/simple_mob/animal/sif/shantak = 10),
|
||||
list(/mob/living/simple_mob/animal/sif/savik,),
|
||||
list(/mob/living/simple_mob/animal/sif/hooligan_crab),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/space/alien = 50,
|
||||
/mob/living/simple_mob/animal/space/alien/drone = 40,
|
||||
/mob/living/simple_mob/animal/space/alien/sentinel = 25,
|
||||
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian = 15,
|
||||
/mob/living/simple_mob/animal/space/alien/queen = 10,
|
||||
/mob/living/simple_mob/animal/space/alien/queen/empress = 5,
|
||||
/mob/living/simple_mob/animal/space/alien/queen/empress/mother = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/animal/space/bats/cult/strong),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/space/bear,
|
||||
/mob/living/simple_mob/animal/space/bear/brown
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/animal/space/carp = 50,
|
||||
/mob/living/simple_mob/animal/space/carp/large = 10,
|
||||
/mob/living/simple_mob/animal/space/carp/large/huge = 5
|
||||
),
|
||||
list(/mob/living/simple_mob/animal/space/goose),
|
||||
list(/mob/living/simple_mob/animal/space/jelly),
|
||||
list(/mob/living/simple_mob/animal/space/tree),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound = 10,
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi = 1,
|
||||
),
|
||||
list(/mob/living/simple_mob/vore/aggressive/deathclaw),
|
||||
list(/mob/living/simple_mob/vore/aggressive/dino),
|
||||
list(/mob/living/simple_mob/vore/aggressive/dragon),
|
||||
list(/mob/living/simple_mob/vore/aggressive/dragon/virgo3b),
|
||||
list(/mob/living/simple_mob/vore/aggressive/frog),
|
||||
list(/mob/living/simple_mob/vore/aggressive/giant_snake),
|
||||
list(/mob/living/simple_mob/vore/aggressive/mimic),
|
||||
list(/mob/living/simple_mob/vore/aggressive/panther),
|
||||
list(/mob/living/simple_mob/vore/aggressive/rat),
|
||||
list(/mob/living/simple_mob/vore/bee),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/sect_drone = 10,
|
||||
/mob/living/simple_mob/vore/sect_queen = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/vore/solargrub),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/oregrub = 5,
|
||||
/mob/living/simple_mob/vore/oregrub/lava = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/vore/catgirl),
|
||||
list(/mob/living/simple_mob/vore/wolfgirl),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/lamia,
|
||||
/mob/living/simple_mob/vore/lamia/albino,
|
||||
/mob/living/simple_mob/vore/lamia/albino/bra,
|
||||
/mob/living/simple_mob/vore/lamia/albino/shirt,
|
||||
/mob/living/simple_mob/vore/lamia/bra,
|
||||
/mob/living/simple_mob/vore/lamia/cobra,
|
||||
/mob/living/simple_mob/vore/lamia/cobra/bra,
|
||||
/mob/living/simple_mob/vore/lamia/cobra/shirt,
|
||||
/mob/living/simple_mob/vore/lamia/copper,
|
||||
/mob/living/simple_mob/vore/lamia/copper/bra,
|
||||
/mob/living/simple_mob/vore/lamia/copper/shirt,
|
||||
/mob/living/simple_mob/vore/lamia/green,
|
||||
/mob/living/simple_mob/vore/lamia/green/bra,
|
||||
/mob/living/simple_mob/vore/lamia/green/shirt,
|
||||
/mob/living/simple_mob/vore/lamia/zebra,
|
||||
/mob/living/simple_mob/vore/lamia/zebra/bra,
|
||||
/mob/living/simple_mob/vore/lamia/zebra/shirt
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/humanoid/merc = 100,
|
||||
/mob/living/simple_mob/humanoid/merc/melee/sword = 50,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged = 25,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/grenadier = 1,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/ionrifle = 10,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/laser = 5,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/rifle = 5,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/smg = 5,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/sniper = 1,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/space = 10,
|
||||
/mob/living/simple_mob/humanoid/merc/ranged/technician = 5
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/humanoid/pirate = 3,
|
||||
/mob/living/simple_mob/humanoid/pirate/ranged = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/mechanical/combat_drone),
|
||||
list(/mob/living/simple_mob/mechanical/corrupt_maint_drone),
|
||||
list(
|
||||
/mob/living/simple_mob/mechanical/hivebot = 100,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/backline = 10,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/basic = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/dot = 5,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/ion = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser = 10,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/rapid = 2,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege = 1,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege/emp = 5,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege/fragmentation = 1,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege/radiation = 1,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong = 3,
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong/guard = 3,
|
||||
/mob/living/simple_mob/mechanical/hivebot/support = 8,
|
||||
/mob/living/simple_mob/mechanical/hivebot/support/commander = 5,
|
||||
/mob/living/simple_mob/mechanical/hivebot/support/commander/autofollow = 10,
|
||||
/mob/living/simple_mob/mechanical/hivebot/swarm = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/armored = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_bullet = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_laser = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_melee = 20,
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/meatshield = 20
|
||||
),
|
||||
list(/mob/living/simple_mob/mechanical/infectionbot),
|
||||
list(/mob/living/simple_mob/mechanical/mining_drone),
|
||||
list(/mob/living/simple_mob/mechanical/technomancer_golem),
|
||||
list(
|
||||
/mob/living/simple_mob/mechanical/viscerator,
|
||||
/mob/living/simple_mob/mechanical/viscerator/piercing
|
||||
),
|
||||
list(/mob/living/simple_mob/mechanical/wahlem),
|
||||
list(/mob/living/simple_mob/animal/passive/fox/syndicate),
|
||||
list(/mob/living/simple_mob/animal/passive/fox),
|
||||
list(/mob/living/simple_mob/animal/wolf/direwolf),
|
||||
list(/mob/living/simple_mob/animal/space/jelly),
|
||||
list(
|
||||
/mob/living/simple_mob/otie/feral,
|
||||
/mob/living/simple_mob/otie/feral/chubby,
|
||||
/mob/living/simple_mob/otie/red,
|
||||
/mob/living/simple_mob/otie/red/chubby
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/shadekin/blue = 100,
|
||||
/mob/living/simple_mob/shadekin/green = 50,
|
||||
/mob/living/simple_mob/shadekin/orange = 20,
|
||||
/mob/living/simple_mob/shadekin/purple = 60,
|
||||
/mob/living/simple_mob/shadekin/red = 40,
|
||||
/mob/living/simple_mob/shadekin/yellow = 1
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound,
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi
|
||||
),
|
||||
list(/mob/living/simple_mob/vore/aggressive/deathclaw),
|
||||
list(/mob/living/simple_mob/vore/aggressive/dino),
|
||||
list(/mob/living/simple_mob/vore/aggressive/dragon),
|
||||
list(/mob/living/simple_mob/vore/aggressive/dragon/virgo3b),
|
||||
list(/mob/living/simple_mob/vore/aggressive/frog),
|
||||
list(/mob/living/simple_mob/vore/aggressive/giant_snake),
|
||||
list(/mob/living/simple_mob/vore/aggressive/mimic),
|
||||
list(/mob/living/simple_mob/vore/aggressive/panther),
|
||||
list(/mob/living/simple_mob/vore/aggressive/rat),
|
||||
list(/mob/living/simple_mob/vore/bee),
|
||||
list(/mob/living/simple_mob/vore/catgirl),
|
||||
list(/mob/living/simple_mob/vore/cookiegirl),
|
||||
list(/mob/living/simple_mob/vore/fennec),
|
||||
list(/mob/living/simple_mob/vore/fennix),
|
||||
list(/mob/living/simple_mob/vore/hippo),
|
||||
list(/mob/living/simple_mob/vore/horse),
|
||||
list(/mob/living/simple_mob/vore/oregrub),
|
||||
list(/mob/living/simple_mob/vore/rabbit),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/redpanda = 50,
|
||||
/mob/living/simple_mob/vore/redpanda/fae = 1
|
||||
),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/sect_drone = 10,
|
||||
/mob/living/simple_mob/vore/sect_queen = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/vore/solargrub),
|
||||
list(/mob/living/simple_mob/vore/woof),
|
||||
list(/mob/living/simple_mob/vore/alienanimals/teppi),
|
||||
list(/mob/living/simple_mob/vore/alienanimals/space_ghost),
|
||||
list(/mob/living/simple_mob/vore/alienanimals/catslug),
|
||||
list(/mob/living/simple_mob/vore/alienanimals/space_jellyfish),
|
||||
list(/mob/living/simple_mob/vore/alienanimals/startreader),
|
||||
list(/mob/living/simple_mob/vore/bigdragon),
|
||||
list(
|
||||
/mob/living/simple_mob/vore/leopardmander = 50,
|
||||
/mob/living/simple_mob/vore/leopardmander/blue = 10,
|
||||
/mob/living/simple_mob/vore/leopardmander/exotic = 1
|
||||
),
|
||||
list(/mob/living/simple_mob/vore/sheep),
|
||||
list(/mob/living/simple_mob/vore/weretiger),
|
||||
list(/mob/living/simple_mob/vore/alienanimals/skeleton),
|
||||
list(/mob/living/simple_mob/vore/alienanimals/dustjumper)
|
||||
)
|
||||
|
||||
/obj/item/capture_crystal/random/Initialize()
|
||||
var/subchoice = pickweight(possible_mob_types) //Some of the lists have nested lists, so let's pick one of them
|
||||
var/choice = pickweight(subchoice) //And then we'll pick something from whatever's left
|
||||
spawn_mob_type = choice //Now when someone uses this, we'll spawn whatever we picked!
|
||||
return ..()
|
||||
|
||||
/mob/living
|
||||
var/capture_crystal = TRUE //If TRUE, the mob is capturable. Otherwise it isn't.
|
||||
var/capture_caught = FALSE //If TRUE, the mob has already been caught, and so cannot be caught again.
|
||||
@@ -254,6 +254,7 @@
|
||||
desc = "A chocolate-coated biscuit stick."
|
||||
icon_state = "pockystick"
|
||||
item_state = "pocky"
|
||||
type_butt = null
|
||||
|
||||
/obj/item/clothing/mask/chewable/candy/pocky/process()
|
||||
chew()
|
||||
|
||||
@@ -85,8 +85,8 @@
|
||||
/obj/item/weapon/beach_ball/holoball,
|
||||
/obj/item/toy/balloon,
|
||||
/obj/item/toy/blink,
|
||||
/obj/item/toy/crossbow,
|
||||
/obj/item/weapon/gun/projectile/revolver/capgun,
|
||||
/obj/item/weapon/gun/projectile/revolver/toy/crossbow,
|
||||
/obj/item/weapon/storage/box/capguntoy,
|
||||
/obj/item/toy/katana,
|
||||
/obj/item/toy/mecha/deathripley,
|
||||
/obj/item/toy/mecha/durand,
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
C.throw_mode_on()
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && path != 2)
|
||||
if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && !detonator && path != 2)
|
||||
var/obj/item/device/assembly_holder/det = W
|
||||
if(istype(det.a_left,det.a_right.type) || (!isigniter(det.a_left) && !isigniter(det.a_right)))
|
||||
to_chat(user, "<span class='warning'>Assembly must contain one igniter.</span>")
|
||||
@@ -314,4 +314,3 @@
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
@@ -116,7 +116,6 @@
|
||||
else
|
||||
log_and_message_admins("attempted to emag \an [A].")
|
||||
// Vorestation Edit: End of Edit
|
||||
log_and_message_admins("emagged \an [A].")
|
||||
|
||||
if(uses<1)
|
||||
user.visible_message("<span class='warning'>\The [src] fizzles and sparks - it seems it's been used once too often, and is now spent.</span>")
|
||||
|
||||
@@ -261,6 +261,10 @@
|
||||
name = "Talon Pilot ID"
|
||||
initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-purple", "stripe-purple")
|
||||
|
||||
/obj/item/weapon/card/id/talon/miner
|
||||
name = "Talon Mining ID"
|
||||
initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-brown", "stripe-brown")
|
||||
|
||||
/obj/item/weapon/card/id/talon/captain
|
||||
name = "Talon Captain ID"
|
||||
initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-gold", "stripe-gold")
|
||||
|
||||
@@ -208,6 +208,7 @@
|
||||
"Shaft Miner" = "itg",
|
||||
"Intern" = "itg",
|
||||
"Talon Pilot" = "itg",
|
||||
"Talon Miner" = "itg",
|
||||
"Bartender" = "itg_green",
|
||||
"Botanist" = "itg_green",
|
||||
"Chef" = "itg_green",
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
desc = "An implant allowing someone to speak the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with producing sounds, not understanding them."
|
||||
known_implant = TRUE
|
||||
var/list/languages = list(LANGUAGE_GALCOM) // List of languages that this assists with
|
||||
initialize_loc = BP_HEAD
|
||||
|
||||
/obj/item/weapon/implant/language/post_implant(mob/M) // Amends the mob's voice organ, then deletes itself
|
||||
if(ishuman(M))
|
||||
|
||||
@@ -23,7 +23,20 @@
|
||||
applies_material_colour = 0
|
||||
drop_sound = 'sound/items/drop/axe.ogg'
|
||||
pickup_sound = 'sound/items/pickup/axe.ogg'
|
||||
/* VOREStation Removal - We have one already
|
||||
/obj/item/weapon/material/knife/machete/hatchet/stone
|
||||
name = "sharp rock"
|
||||
desc = "The secret is to bang the rocks together, guys."
|
||||
force_divisor = 0.2
|
||||
icon_state = "rock"
|
||||
item_state = "rock"
|
||||
attack_verb = list("chopped", "torn", "cut")
|
||||
|
||||
/obj/item/weapon/material/knife/machete/hatchet/stone/set_material(var/new_material)
|
||||
var/old_name = name
|
||||
. = ..()
|
||||
name = old_name
|
||||
*/
|
||||
/obj/item/weapon/material/knife/machete/hatchet/unathiknife
|
||||
name = "duelling knife"
|
||||
desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
|
||||
|
||||
@@ -7,3 +7,30 @@
|
||||
slot_r_hand_str = 'icons/vore/custom_items_right_hand_vr.dmi',
|
||||
)
|
||||
desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked."
|
||||
|
||||
/obj/item/weapon/material/twohanded/longsword
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
name = "longsword"
|
||||
desc = "a more elegant weapon from a more civilised age"
|
||||
icon= 'icons/obj/weapons_vr.dmi'
|
||||
icon_state = "longsword"
|
||||
base_icon = "longsword"
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_melee_vr.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi',
|
||||
)
|
||||
item_state = "saber"
|
||||
unwielded_force_divisor = 0.1
|
||||
force_divisor = 0.3
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
edge = TRUE
|
||||
sharp = TRUE
|
||||
|
||||
|
||||
/obj/item/weapon/material/twohanded/saber/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if (src.wielded == 1)
|
||||
if(unique_parry_check(user, attacker, damage_source) && prob(50))
|
||||
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
|
||||
playsound(src, 'sound/weapons/punchmiss.ogg', 50, 1)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -92,3 +92,11 @@
|
||||
icon_state = "explorer_shield_P_lighted"
|
||||
else
|
||||
icon_state = "explorer_shield_P"
|
||||
|
||||
/obj/item/weapon/shield/primitive
|
||||
name = "primitive shield"
|
||||
desc = "A defensive object that is little more than planks strapped your arm"
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "buckler"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
base_block_chance = 30
|
||||
|
||||
@@ -190,3 +190,14 @@
|
||||
icon_override = 'icons/inventory/back/mob_vr.dmi'
|
||||
item_state = "kr_rucksack"
|
||||
icon_state = "kr_rucksack"
|
||||
|
||||
|
||||
//strapless
|
||||
/obj/item/weapon/storage/backpack/satchel/strapless
|
||||
name = "strapless satchel"
|
||||
desc = "A satchel for carrying a large number of supplies easily. Without Straps"
|
||||
icon = 'icons/inventory/back/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/back/mob_vr.dmi'
|
||||
icon_state = "satchel_strapless"
|
||||
item_state_slots = null
|
||||
|
||||
|
||||
@@ -123,11 +123,11 @@
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/belt/utility/holding
|
||||
name = "tool-belt of holding"
|
||||
name = "tool-belt of holding"
|
||||
desc = "A belt that uses localized bluespace pockets to hold more items than expected!"
|
||||
icon_state = "utility_holding"
|
||||
storage_slots = 14 //twice the amount as a normal belt
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 14
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 14
|
||||
can_hold = list(
|
||||
/obj/item/weapon/tool/crowbar,
|
||||
/obj/item/weapon/tool/screwdriver,
|
||||
@@ -158,7 +158,13 @@
|
||||
/obj/item/stack/nanopaste,
|
||||
/obj/item/weapon/cell, //this is a bigger belt, might as well make it hold bigger cells too
|
||||
/obj/item/weapon/pipe_dispenser, //bigger belt for bigger tools
|
||||
/obj/item/weapon/rcd //see above
|
||||
/obj/item/weapon/rcd, //see above
|
||||
/obj/item/device/quantum_pad_booster,
|
||||
/obj/item/weapon/inducer,
|
||||
/obj/item/stack/material/steel,
|
||||
/obj/item/stack/material/glass,
|
||||
/obj/item/device/lightreplacer,
|
||||
/obj/item/weapon/pickaxe/plasmacutter
|
||||
)
|
||||
|
||||
|
||||
@@ -201,11 +207,11 @@
|
||||
icon_state = "ems"
|
||||
|
||||
/obj/item/weapon/storage/belt/medical/holding
|
||||
name = "medical belt of holding"
|
||||
name = "medical belt of holding"
|
||||
desc = "A belt that uses localized bluespace pockets to hold more items than expected!"
|
||||
icon_state = "med_holding"
|
||||
storage_slots = 14 //twice the amount as a normal belt
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 14
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 14
|
||||
|
||||
/obj/item/weapon/storage/belt/security
|
||||
name = "security belt"
|
||||
@@ -523,4 +529,13 @@
|
||||
name = "ranger belt"
|
||||
desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear."
|
||||
icon = 'icons/obj/clothing/ranger.dmi'
|
||||
icon_state = "ranger_belt"
|
||||
icon_state = "ranger_belt"
|
||||
|
||||
/obj/item/weapon/storage/belt/dbandolier
|
||||
name = "\improper Donk-Soft bandolier"
|
||||
desc = "A Donk-Soft bandolier! Carry your spare darts anywhere! Ages 8 and up."
|
||||
icon_state = "dbandolier"
|
||||
storage_slots = 8
|
||||
can_hold = list(
|
||||
/obj/item/ammo_casing/afoam_dart
|
||||
)
|
||||
@@ -142,124 +142,6 @@
|
||||
/obj/item/weapon/dnainjector/m2h = 3
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/box/blanks
|
||||
name = "box of blank shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front."
|
||||
icon_state = "blankshot_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/blank = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/blanks/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/blank = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/beanbags
|
||||
name = "box of beanbag shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "beanshot_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/beanbag = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/beanbag = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/shotgunammo
|
||||
name = "box of shotgun slugs"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "lethalshellshot_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/shotgunammo/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/shotgunshells
|
||||
name = "box of shotgun shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "lethalslug_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/pellet = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/shotgunshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/pellet = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/flashshells
|
||||
name = "box of illumination shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "illumshot_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/flash = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/flashshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/flash = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/stunshells
|
||||
name = "box of stun shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "stunshot_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/stunshell = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/stunshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/stunshell = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/practiceshells
|
||||
name = "box of practice shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "blankshot_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/practice = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/practiceshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/practice = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/empshells
|
||||
name = "box of emp shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front."
|
||||
icon_state = "empshot_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/emp = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/empshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/emp = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/flechetteshells
|
||||
name = "box of shotgun flechettes"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
icon_state = "lethalslug_box"
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/flechette = 8)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/flechetteshells/large
|
||||
starts_with = list(/obj/item/ammo_casing/a12g/flechette = 16)
|
||||
|
||||
/obj/item/weapon/storage/box/sniperammo
|
||||
name = "box of 14.5mm shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
starts_with = list(/obj/item/ammo_casing/a145 = 7)
|
||||
drop_sound = 'sound/items/drop/ammobox.ogg'
|
||||
pickup_sound = 'sound/items/pickup/ammobox.ogg'
|
||||
|
||||
/obj/item/weapon/storage/box/sniperammo/highvel
|
||||
name = "box of 14.5mm sabot shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||
starts_with = list(/obj/item/ammo_casing/a145/highvel = 7)
|
||||
|
||||
/obj/item/weapon/storage/box/flashbangs
|
||||
name = "box of flashbangs (WARNING)"
|
||||
desc = "<B>WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use.</B>"
|
||||
@@ -566,3 +448,17 @@
|
||||
name = "ambrosia deus seeds box"
|
||||
desc = "Contains the seeds you need to get a proper healthy high."
|
||||
starts_with = list(/obj/item/seeds/ambrosiadeusseed = 7)
|
||||
|
||||
/obj/item/weapon/storage/box/capguntoy
|
||||
name = "\improper AlliCo \"Zipper\" Cap Gun"
|
||||
icon = 'icons/obj/gun_toy.dmi'
|
||||
icon_state = "cap_gun_box"
|
||||
desc = "This box is shaped on the inside so that only the \"Zipper\" Capgun and extra caps can fit."
|
||||
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
|
||||
storage_slots = 2
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
can_hold = list(/obj/item/weapon/gun/projectile/revolver/capgun, /obj/item/ammo_magazine/ammo_box/cap)
|
||||
starts_with = list(
|
||||
/obj/item/weapon/gun/projectile/revolver/capgun = 1,
|
||||
/obj/item/ammo_magazine/ammo_box/cap = 1
|
||||
)
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
item_state = "candlebox5"
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_BELT
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 5
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 5
|
||||
can_hold = list(/obj/item/weapon/flame/candle)
|
||||
starts_with = list(/obj/item/weapon/flame/candle = 5)
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
item_state = "whitecandlebox5"
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_BELT
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 5
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 5
|
||||
can_hold = list(/obj/item/weapon/flame/candle)
|
||||
starts_with = list(/obj/item/weapon/flame/candle/white = 5)
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
item_state = "blackcandlebox5"
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_BELT
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 5
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 5
|
||||
can_hold = list(/obj/item/weapon/flame/candle)
|
||||
starts_with = list(/obj/item/weapon/flame/candle/black = 5)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
can_hold = null
|
||||
pocketable = TRUE
|
||||
|
||||
var/insert_delay = 0
|
||||
var/insert_delay = 0 SECONDS
|
||||
var/remove_delay = 2 SECONDS
|
||||
|
||||
/obj/item/weapon/storage/pouch/stall_insertion(obj/item/W, mob/user)
|
||||
@@ -23,26 +23,23 @@
|
||||
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
|
||||
return TRUE // Skip delay
|
||||
|
||||
if(insert_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TASK_USER_EXCLUSIVE))
|
||||
return FALSE // Moved or whatever
|
||||
if(insert_delay && !do_after(user, insert_delay, src, needhand = TRUE, exclusive = TASK_USER_EXCLUSIVE))
|
||||
return FALSE // Moved while there is a delay
|
||||
|
||||
if(W in src)
|
||||
return TRUE // Item is still inside
|
||||
|
||||
return FALSE
|
||||
return TRUE //Now we're allowed to put the item in the pouch
|
||||
|
||||
/obj/item/weapon/storage/pouch/stall_removal(obj/item/W, mob/user)
|
||||
// No delay if you have the pouch in your hands
|
||||
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
|
||||
return TRUE // Skip delay
|
||||
|
||||
if(remove_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TASK_USER_EXCLUSIVE))
|
||||
return FALSE // Moved or whatever
|
||||
if(remove_delay && !do_after(user, remove_delay, src, needhand = TRUE, exclusive = TASK_USER_EXCLUSIVE))
|
||||
return FALSE // Moved while there is a delay
|
||||
|
||||
if(W in src)
|
||||
return TRUE // Item is still inside
|
||||
|
||||
return FALSE
|
||||
return FALSE //Item was somehow already removed
|
||||
|
||||
/obj/item/weapon/storage/pouch/pocket_description(mob/haver, mob/examiner)
|
||||
return "[src]"
|
||||
|
||||
Reference in New Issue
Block a user