diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm
index df83ba66ec..ae3773be74 100644
--- a/code/__defines/dcs/signals.dm
+++ b/code/__defines/dcs/signals.dm
@@ -58,8 +58,8 @@
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
///from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMSIG_PARENT_ATTACKBY "atom_attackby"
-///Return this in response if you don't want afterattack to be called
- #define COMPONENT_NO_AFTERATTACK (1<<0)
+///Return this in response if you don't want later item attack procs to be called.
+ #define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0)
///from base of atom/attack_hulk(): (/mob/living/carbon/human)
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack"
///from base of atom/animal_attack(): (/mob/user)
@@ -94,6 +94,7 @@
#define COMSIG_ATOM_BUMPED "atom_bumped"
///from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
+ #define COMPONENT_IGNORE_EXPLOSION (1<<0)
///from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
@@ -225,7 +226,7 @@
// /atom/movable signals
-///from base of atom/movable/Moved(): (/atom)
+///from base of atom/movable/Move(): (atom/newloc, dir, movetime)
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
///from base of atom/movable/Moved(): (/atom, dir)
@@ -778,3 +779,5 @@
#define COMSIG_CONFLICT_ELEMENT_CHECK "conflict_element_check"
/// A conflict was found
#define ELEMENT_CONFLICT_FOUND (1<<0)
+//From reagents touch_x.
+#define COMSIG_REAGENTS_TOUCH "reagent_touch"
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index a1aedad119..c55ec430e3 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -25,28 +25,48 @@ avoid code duplication. This includes items that may sometimes act as a standard
return
return
-// Called at the start of resolve_attackby(), before the actual attack.
-/obj/item/proc/pre_attack(atom/a, mob/user)
- return
+/**
+ * Called at the start of resolve_attackby(), before the actual attack.
+ *
+ * Arguments:
+ * * atom/A - The atom about to be hit
+ * * mob/living/user - The mob doing the htting
+ * * params - click params such as alt/shift etc
+ *
+ * See: [/obj/item/proc/melee_attack_chain]
+ */
+
+/obj/item/proc/pre_attack(atom/A, mob/user, params) //do stuff before attackby!
+ if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return TRUE
+ return FALSE //return TRUE to avoid calling attackby after this proc does stuff
//I would prefer to rename this to attack(), but that would involve touching hundreds of files.
/obj/item/proc/resolve_attackby(atom/A, mob/user, var/attack_modifier = 1, var/click_parameters)
- pre_attack(A, user)
add_fingerprint(user)
+ . = pre_attack(A, user, click_parameters)
+ if(.) // We're returning the value of pre_attack, important if it has a special return.
+ return
return A.attackby(src, user, attack_modifier, click_parameters)
// No comment
/atom/proc/attackby(obj/item/W, mob/user, var/attack_modifier, var/click_parameters)
- if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, click_parameters) & COMPONENT_NO_AFTERATTACK)
+ if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, click_parameters) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
return FALSE
/mob/living/attackby(obj/item/I, mob/user, var/attack_modifier, var/click_parameters)
if(!ismob(user))
- return 0
- if(can_operate(src) && I.do_surgery(src,user))
- return 1
+ return FALSE
+
+ if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, I, user, click_parameters) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return FALSE
+
+ if(can_operate(src, user) && I.do_surgery(src,user))
+ return TRUE
+
if(attempt_vr(src,"vore_attackby",args)) return //VOREStation Add - The vore, of course.
+
return I.attack(src, user, user.zone_sel.selecting, attack_modifier)
// Used to get how fast a mob should attack, and influences click delay.
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 3bd1a0afb2..5351139540 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -26,7 +26,9 @@
A.attack_hand(src)
/atom/proc/attack_hand(mob/user as mob)
- return
+ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return TRUE
+ return FALSE
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
return
diff --git a/code/datums/components/crafting/recipes/weapons.dm b/code/datums/components/crafting/recipes/weapons.dm
index 6baa4b5e9b..b8fe974e05 100644
--- a/code/datums/components/crafting/recipes/weapons.dm
+++ b/code/datums/components/crafting/recipes/weapons.dm
@@ -48,3 +48,11 @@
time = 40
category = CAT_WEAPONRY
subcategory = CAT_AMMO
+
+/datum/crafting_recipe/primitive_shield
+ name = "Primitive Shield"
+ result = /obj/item/weapon/shield/primitive
+ reqs = list(list(/obj/item/stack/material/wood = 2), list(/obj/item/weapon/reagent_containers/glass/bucket/wood =1), list(/obj/item/stack/material/cloth = 5))
+ time = 120
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 86573474e6..fbad2752ee 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -115,7 +115,7 @@
if(!(mat_container_flags & MATCONTAINER_SILENT))
to_chat(user, "[parent] won't accept [I]!")
return
- . = COMPONENT_NO_AFTERATTACK
+ . = COMPONENT_CANCEL_ATTACK_CHAIN
var/datum/callback/pc = precondition
if(pc && !pc.Invoke(user))
return
@@ -168,7 +168,7 @@
// It shouldn't be possible to add more matter than our max
ASSERT((total_amount + (matter_per_sheet * sheets_to_use)) <= max_amount)
-
+
// Use the amount of sheets from the stack
if(!S.use(sheets_to_use))
to_chat(user, "Something went wrong with your stack. Split it manually and try again.")
@@ -358,7 +358,7 @@
if(materials[M] < (sheet_amt * SHEET_MATERIAL_AMOUNT))
sheet_amt = round(materials[M] / SHEET_MATERIAL_AMOUNT)
- var/obj/item/stack/S = M.stack_type
+ var/obj/item/stack/S = M.stack_type
var/max_stack_size = initial(S.max_amount)
var/count = 0
diff --git a/code/datums/outfits/costumes/halloween.dm b/code/datums/outfits/costumes/halloween.dm
index 76b510807a..35f4aa238d 100644
--- a/code/datums/outfits/costumes/halloween.dm
+++ b/code/datums/outfits/costumes/halloween.dm
@@ -25,8 +25,8 @@
var/obj/item/weapon/storage/briefcase/new_briefcase = new(H)
for(var/obj/item/briefcase_item in new_briefcase)
qdel(briefcase_item)
- new_briefcase.contents += new /obj/item/toy/crossbow
- new_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/capgun
+ new_briefcase.contents += new /obj/item/weapon/gun/projectile/pistol/toy
+ new_briefcase.contents += new /obj/item/ammo_magazine/mfoam_dart/pistol
new_briefcase.contents += new /obj/item/clothing/mask/gas/clown_hat
H.equip_to_slot_or_del(new_briefcase, slot_l_hand)
@@ -102,7 +102,7 @@
suit = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless
shoes = /obj/item/clothing/shoes/boots/jackboots
gloves = /obj/item/clothing/gloves/fingerless
- l_pocket = /obj/item/toy/crossbow
+ l_pocket = /obj/item/weapon/gun/projectile/revolver/toy/crossbow/halloween
r_pocket = /obj/item/device/flashlight/color/red
/decl/hierarchy/outfit/costume/pirate
@@ -119,4 +119,12 @@
shoes = /obj/item/clothing/shoes/white
suit = /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout
gloves = /obj/item/clothing/gloves/white
- mask = /obj/item/clothing/mask/surgical
\ No newline at end of file
+ mask = /obj/item/clothing/mask/surgical
+
+/decl/hierarchy/outfit/costume/marine
+ name = OUTFIT_COSTUME("Ruin Marine")
+ uniform = /obj/item/clothing/under/color/grey
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/marine
+ suit = /obj/item/clothing/suit/marine
+ r_hand = /obj/item/weapon/gun/projectile/revolver/toy/sawnoff
\ No newline at end of file
diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm
index b3263590ca..dbe2143e03 100644
--- a/code/datums/supplypacks/misc_vr.dm
+++ b/code/datums/supplypacks/misc_vr.dm
@@ -161,16 +161,3 @@
cost = 300
containertype = /obj/structure/closet/crate
containername = "cordless jukebox speakers crate"
-
-/datum/supply_pack/misc/sword
- name = "sword"
- contains = list(
- /obj/item/weapon/material/sword =2
- )
- cost =100
- access = list(access_explorer,
- access_security,)
-
- one_access = TRUE
- containername = "sword crate"
- containertype = /obj/structure/closet/crate/secure/gear
diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm
index daeee1ffbd..71ee712e13 100644
--- a/code/datums/supplypacks/munitions.dm
+++ b/code/datums/supplypacks/munitions.dm
@@ -187,6 +187,14 @@
containername = "Magnetic ammunition crate"
access = access_security
+/datum/supply_pack/munitions/claymore
+ name = "Weapons - Melee - Claymores"
+ contains = list(/obj/item/weapon/material/sword = 2)
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure/weapon
+ containername = "Claymore crate"
+ access = access_armory //two swords that are a one-hit 40 brute + IB chance should be armory-locked
+
/datum/supply_pack/munitions/shotgunammo
name = "Ammunition - Shotgun shells"
contains = list(
diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index a3b6ad30d5..ba6a33d48c 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -1,7 +1,7 @@
/*
-* Here is where any supply packs
-* related to recreation live.
-*/
+ * Here is where any supply packs
+ * related to recreation live.
+ */
/datum/supply_pack/recreation
@@ -23,6 +23,25 @@
containertype = /obj/structure/closet/crate/allico
containername = "foam weapon crate"
+/datum/supply_pack/recreation/donksoftweapons
+ name = "Donk-Soft Weapon Crate"
+ contains = list(
+ /obj/item/ammo_magazine/ammo_box/foam = 2,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy = 2,
+ /obj/item/weapon/gun/projectile/pistol/toy = 2,
+ /obj/item/ammo_magazine/mfoam_dart/pistol = 2
+ )
+ cost = 50
+ containertype = /obj/structure/closet/crate/allico
+ containername = "foam weapon crate"
+
+/datum/supply_pack/recreation/donksoftvend
+ name = "Donk-Soft Vendor Crate"
+ contains = list()
+ cost = 75
+ containertype = /obj/structure/largecrate/donksoftvendor
+ containername = "\improper Donk-Soft vendor crate"
+
/datum/supply_pack/recreation/lasertag
name = "Lasertag equipment"
contains = list(
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 3b1088dff4..d56186f5b0 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -125,6 +125,8 @@
/atom/proc/Bumped(AM as mob|obj)
set waitfor = FALSE
+ SEND_SIGNAL(src, COMSIG_ATOM_BUMPED, AM)
+
// Convenience proc to see if a container is open for chemistry handling
// returns true if open
// false if closed
@@ -166,6 +168,9 @@
return
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
+ if(SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return
+
P.on_hit(src, 0, def_zone)
. = 0
@@ -260,8 +265,8 @@
invisibility = new_invisibility
return TRUE
-/atom/proc/ex_act()
- return
+/atom/proc/ex_act(var/strength = 3)
+ return (SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, strength, src) & COMPONENT_IGNORE_EXPLOSION)
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
return -1
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 75ac947ac9..29c937afd6 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -87,6 +87,9 @@
if(!loc || !newloc)
return FALSE
+ if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc, direct, movetime) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE)
+ return FALSE
+
// Store this early before we might move, it's used several places
var/atom/oldloc = loc
@@ -234,6 +237,9 @@
riding_datum.handle_vehicle_offsets()
for (var/datum/light_source/light as anything in light_sources) // Cycle through the light sources on this atom and tell them to update.
light.source_atom.update_light()
+
+ SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, direction)
+
return TRUE
/atom/movable/set_dir(newdir)
@@ -267,6 +273,9 @@
throwing = 0
if(QDELETED(A))
return
+
+ SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
+
A.Bumped(src)
A.last_bumped = world.time
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 8ec6dfa2b1..37bda6bd0a 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -8,8 +8,8 @@
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
- /obj/item/weapon/gun/projectile/revolver/capgun = 2,
- /obj/item/toy/crossbow = 2,
+ /obj/item/weapon/storage/box/capguntoy = 2,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
/obj/item/toy/spinningtoy = 2,
diff --git a/code/game/machinery/computer/arcade_vr.dm b/code/game/machinery/computer/arcade_vr.dm
index 210f31360f..cc5bd8fe74 100644
--- a/code/game/machinery/computer/arcade_vr.dm
+++ b/code/game/machinery/computer/arcade_vr.dm
@@ -3,8 +3,8 @@
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
- /obj/item/weapon/gun/projectile/revolver/capgun = 2,
- /obj/item/toy/crossbow = 2,
+ /obj/item/weapon/storage/box/capguntoy = 2,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
/obj/item/toy/spinningtoy = 2,
diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm
index a8dd875f30..3fdb9c6659 100644
--- a/code/game/objects/items/toys/mech_toys.dm
+++ b/code/game/objects/items/toys/mech_toys.dm
@@ -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(" [attacker] begins charging its special attack!! ", \
" You begin charging [attacker]'s special attack! ")
- 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(" [src] begins charging its special attack!! ", \
" You begin charging [src]'s special attack! ")
- 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(" ...and lands a CRIPPLING BLOW! ", \
- " ...and you land a CRIPPLING blow on [attacker]! ", null)
+ " ...and you land a CRIPPLING blow on [attacker]! ", null)
else
attacker_controller.visible_message(" [src] and [attacker] stand around awkwardly.", \
- " You don't know what to do next.")
+ " You don't know what to do next.")
- 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(" MUTUALLY ASSURED DESTRUCTION!! [src] and [attacker] both end up destroyed!", \
- " Both [src] and [attacker] are destroyed!")
+ " Both [src] and [attacker] are destroyed!")
else if(attacker.combat_health <= 0) //src wins
wins++
attacker.losses++
@@ -359,7 +359,7 @@
" You raise up [src] victoriously over [attacker]!")
else if (combat_health <= 0) //attacker wins
attacker.wins++
- losses++
+ losses++
playsound(src, 'sound/effects/light_flicker.ogg', 20, TRUE)
src_controller.visible_message(" [src] collapses!", \
" [src] collapses!", 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, "[target ? T.His : "Your" ] [attacker.name] is in combat.")
- if(target)
+ if(target)
to_chat(target, "Your [attacker.name] is in combat.")
- return FALSE
+ return FALSE
if(in_combat)
to_chat(user, "Your [name] is in combat.")
- if(target)
+ if(target)
to_chat(target, "[T.His] [name] is in combat.")
- return FALSE
+ return FALSE
if(attacker && attacker.timer > world.time)
to_chat(user, "[target?T.His : "Your" ] [attacker.name] isn't ready for battle.")
- if(target)
+ if(target)
to_chat(target, "Your [attacker.name] isn't ready for battle.")
- return FALSE
+ return FALSE
if(timer > world.time)
to_chat(user, "Your [name] isn't ready for battle.")
- if(target)
+ if(target)
to_chat(target, "[T.His] [name] isn't ready for battle.")
- 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(" [src] does a cool flip.")
-
+
/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.
diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm
index 02ffebe8c7..4b5e671e49 100644
--- a/code/game/objects/items/toys/toys.dm
+++ b/code/game/objects/items/toys/toys.dm
@@ -3,8 +3,6 @@
* Balloons
* Fake telebeacon
* Fake singularity
- * Toy gun
- * Toy crossbow
* Toy swords
* Toy bosun's whistle
* Snap pops
@@ -145,127 +143,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)
- . += "It is loaded with [bullets] foam darts!"
-
-/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, "You load the foam dart into the crossbow.")
- else
- to_chat(usr, "It's already fully loaded.")
-
-
-/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("\The [] was hit by the foam dart!", 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("\The [] realized they were out of ammo and starting scrounging for some!", 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("\The [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull", 2)
- O.show_message(text("\The [] was hit in the head by the foam dart!", 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("\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!", user, M), 1, "You hear someone fall", 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
*/
@@ -394,7 +271,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."
@@ -1526,7 +1402,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
diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index aae72540c0..db7dc423a3 100644
--- a/code/game/objects/items/toys/toys_vr.dm
+++ b/code/game/objects/items/toys/toys_vr.dm
@@ -1,17 +1,47 @@
+/* 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"
-<<<<<<< HEAD
-=======
/*
* 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
->>>>>>> fc7a67073bd... Merge pull request #12288 from Hatterhat/slimeiyoshi-plush
+/*
+ * Plushies
+ */
/obj/item/toy/plushie/lizardplushie
name = "lizard plushie"
desc = "An adorable stuffed toy that resembles a lizardperson."
@@ -111,38 +141,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."
@@ -182,7 +180,6 @@
else
return ..()
-
/obj/item/toy/plushie/ipc/attack_self(mob/user as mob)
if(!cooldown)
playsound(user, 'sound/machines/ping.ogg', 10, 0)
@@ -286,7 +283,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")
@@ -296,9 +295,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("Stab!")
+ 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")
@@ -319,6 +363,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?"
@@ -342,6 +389,9 @@
playsound(loc, 'sound/items/drop/plushie.ogg', 50, 1)
user.visible_message("\The [user] gnaws on [src]!","You gnaw on [src]!")
+/*
+ * Cat toys
+ */
/obj/item/toy/cat_toy
name = "toy mouse"
desc = "A colorful toy mouse!"
@@ -361,6 +411,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."
@@ -386,6 +439,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."
@@ -406,12 +462,18 @@
else
to_chat(user, "Nothing happens.")
+/*
+ * 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!"
@@ -446,6 +508,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."
@@ -472,6 +537,9 @@
return 0
+/*
+ * Toy cuffs
+ */
/obj/item/weapon/handcuffs/fake
name = "plastic handcuffs"
desc = "Use this to keep plastic prisoners in line."
@@ -496,6 +564,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."
@@ -522,6 +593,9 @@
if(istype(I, /obj/item/weapon/disk/nuclear))
to_chat(user, "Nice try. Put that disk back where it belongs.")
+/*
+ * 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."
@@ -559,6 +633,9 @@
else ..()
+/*
+ * Toy xeno
+ */
/obj/item/toy/toy_xeno
icon = 'icons/obj/toy_vr.dmi'
icon_state = "xeno"
@@ -583,6 +660,9 @@
to_chat(user, "The string on [src] hasn't rewound all the way!")
return
+/*
+ * Russian revolver
+ */
/obj/item/toy/russian_revolver
name = "russian revolver"
desc = "For fun and games!"
@@ -653,6 +733,9 @@
to_chat(user, "[src] needs to be reloaded.")
return FALSE
+/*
+ * Trick revolver
+ */
/obj/item/toy/russian_revolver/trick_revolver
name = "\improper .357 revolver"
desc = "A suspicious revolver. Uses .357 ammo."
@@ -680,6 +763,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"
@@ -702,6 +788,9 @@
/obj/item/toy/chainsaw/proc/cooldownreset()
cooldown = 0
+/*
+ * Random miniature spawner
+ */
/obj/random/miniature
name = "Random miniature"
desc = "This is a random miniature."
@@ -711,6 +800,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."
@@ -787,3 +879,93 @@
real = 2
to_chat(user, "You short out the bluespace refill system of [src].")
+/*
+ * 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!"
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 285fba5bfd..d7fcb01fce 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -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,
diff --git a/code/game/objects/items/weapons/shields_vr.dm b/code/game/objects/items/weapons/shields_vr.dm
index 514ecd15c9..a311a74089 100644
--- a/code/game/objects/items/weapons/shields_vr.dm
+++ b/code/game/objects/items/weapons/shields_vr.dm
@@ -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
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 9e82b6f434..96d0326654 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -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,
@@ -164,7 +164,7 @@
/obj/item/stack/material/steel,
/obj/item/stack/material/glass,
/obj/item/device/lightreplacer,
- /obj/item/weapon/pickaxe/plasmacutter
+ /obj/item/weapon/pickaxe/plasmacutter
)
@@ -207,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"
@@ -530,3 +530,12 @@
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"
+
+/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
+ )
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index abce195604..784942f5d7 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -568,3 +568,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
+ )
diff --git a/code/game/objects/items/weapons/storage/boxes_ch.dm b/code/game/objects/items/weapons/storage/boxes_ch.dm
index 70fd7a256d..c1c8c26db8 100644
--- a/code/game/objects/items/weapons/storage/boxes_ch.dm
+++ b/code/game/objects/items/weapons/storage/boxes_ch.dm
@@ -7,12 +7,12 @@
/obj/item/weapon/storage/box/casino/foamcrossbow
name = "foam crossbow"
starts_with = list(
- /obj/item/toy/crossbow,
- /obj/item/toy/ammo/crossbow,
- /obj/item/toy/ammo/crossbow,
- /obj/item/toy/ammo/crossbow,
- /obj/item/toy/ammo/crossbow,
- /obj/item/toy/ammo/crossbow
+ //obj/item/weapon/gun/projectile/revolver/toy/crossbow,
+ /obj/item/ammo_casing/afoam_dart,
+ /obj/item/ammo_casing/afoam_dart,
+ /obj/item/ammo_casing/afoam_dart,
+ /obj/item/ammo_casing/afoam_dart,
+ /obj/item/ammo_casing/afoam_dart
)
/obj/item/weapon/storage/box/casino/costume_whitebunny
@@ -115,4 +115,4 @@
/obj/item/clothing/under/sundress,
/obj/item/clothing/head/wizard/marisa/fake,
/obj/item/weapon/staff/broom
- )
\ No newline at end of file
+ )
diff --git a/code/game/objects/random/gradient.dm b/code/game/objects/random/gradient.dm
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 2ed5c9999d..86b64c2e7d 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -745,7 +745,7 @@
/obj/item/toy/snappop,
/obj/item/toy/sword,
/obj/item/toy/balloon,
- /obj/item/toy/crossbow,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow,
/obj/item/toy/blink,
/obj/item/weapon/reagent_containers/spray/waterflower,
/obj/item/toy/eight_ball,
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 5050fbcb80..10e57f2896 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -12,7 +12,7 @@
/obj/item/clothing/under/rank/chief_engineer/skirt,
/obj/item/clothing/head/hardhat/white,
/obj/item/clothing/head/welding,
- /obj/item/clothing/gloves/yellow,
+ /obj/item/clothing/gloves/heavy_engineer, //VOREStation Edit: chief gets the good shit
/obj/item/clothing/shoes/brown,
/obj/item/weapon/cartridge/ce,
/obj/item/device/radio/headset/heads/ce,
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 2a626c52c9..6b338895e3 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -32,7 +32,7 @@
if(AM.simulated)
AM.forceMove(T)
//VOREStation Add Start
- if(isanimal(AM))
+ if(isanimal(AM))
var/mob/living/simple_mob/AMBLINAL = AM
if(!AMBLINAL.mind)
AMBLINAL.ghostjoin = 1
@@ -65,6 +65,11 @@
ME.attach(H)
..()
+/obj/structure/largecrate/donksoftvendor
+ name = "\improper Donk-Soft vendor crate"
+ desc = "A hefty wooden crate displaying the logo of Donk-Soft. It's rather heavy."
+ starts_with = list(/obj/machinery/vending/donksoft)
+
/obj/structure/largecrate/vehicle
name = "vehicle crate"
desc = "Wulf Aeronautics says it comes in a box for the consumer's sake... How is this so light?"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 690164e265..5466582125 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -334,7 +334,7 @@
corner_piece = TRUE
//color variations
-
+//Middle sofas first
/obj/structure/bed/chair/sofa
sofa_material = "carpet"
@@ -379,92 +379,92 @@
/obj/structure/bed/chair/sofa/corner
icon_state = "sofacorner"
-/obj/structure/bed/chair/sofa/brown/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/brown
+ sofa_material = "leather"
-/obj/structure/bed/chair/sofa/brown/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/brown
+ sofa_material = "leather"
-/obj/structure/bed/chair/sofa/brown/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/brown
+ sofa_material = "leather"
-/obj/structure/bed/chair/sofa/teal/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/teal
+ sofa_material = "teal"
-/obj/structure/bed/chair/sofa/teal/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/teal
+ sofa_material = "teal"
-/obj/structure/bed/chair/sofa/teal/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/teal
+ sofa_material = "teal"
-/obj/structure/bed/chair/sofa/black/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/black
+ sofa_material = "black"
-/obj/structure/bed/chair/sofa/black/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/black
+ sofa_material = "black"
-/obj/structure/bed/chair/sofa/black/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/black
+ sofa_material = "black"
-/obj/structure/bed/chair/sofa/green/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/green
+ sofa_material = "green"
-/obj/structure/bed/chair/sofa/green/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/green
+ sofa_material = "green"
-/obj/structure/bed/chair/sofa/green/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/green
+ sofa_material = "green"
-/obj/structure/bed/chair/sofa/purp/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/purp
+ sofa_material = "purple"
-/obj/structure/bed/chair/sofa/purp/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/purp
+ sofa_material = "purple"
-/obj/structure/bed/chair/sofa/purp/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/purp
+ sofa_material = "purple"
-/obj/structure/bed/chair/sofa/blue/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/blue
+ sofa_material = "blue"
-/obj/structure/bed/chair/sofa/blue/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/blue
+ sofa_material = "blue"
-/obj/structure/bed/chair/sofa/blue/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/blue
+ sofa_material = "blue"
-/obj/structure/bed/chair/sofa/beige/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/beige
+ sofa_material = "beige"
-/obj/structure/bed/chair/sofa/beige/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/beige
+ sofa_material = "beige"
-/obj/structure/bed/chair/sofa/beige/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/beige
+ sofa_material = "beige"
-/obj/structure/bed/chair/sofa/lime/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/lime
+ sofa_material = "lime"
-/obj/structure/bed/chair/sofa/lime/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/lime
+ sofa_material = "lime"
-/obj/structure/bed/chair/sofa/lime/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/lime
+ sofa_material = "lime"
-/obj/structure/bed/chair/sofa/yellow/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/yellow
+ sofa_material = "yellow"
-/obj/structure/bed/chair/sofa/yellow/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/yellow
+ sofa_material = "yellow"
-/obj/structure/bed/chair/sofa/yellow/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/yellow
+ sofa_material = "yellow"
-/obj/structure/bed/chair/sofa/orange/left
- icon_state = "sofaend_left"
+/obj/structure/bed/chair/sofa/left/orange
+ sofa_material = "orange"
-/obj/structure/bed/chair/sofa/orange/right
- icon_state = "sofaend_right"
+/obj/structure/bed/chair/sofa/right/orange
+ sofa_material = "orange"
-/obj/structure/bed/chair/sofa/orange/corner
- icon_state = "sofacorner"
+/obj/structure/bed/chair/sofa/corner/orange
+ sofa_material = "orange"
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index e9d0fa752b..fe0e30f2d0 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -244,6 +244,7 @@
prob(3);/obj/item/weapon/material/butterfly,
prob(3);/obj/item/weapon/material/butterfly/switchblade,
prob(3);/obj/item/clothing/gloves/knuckledusters,
+ prob(3);/obj/item/clothing/gloves/heavy_engineer,
prob(3);/obj/item/weapon/reagent_containers/syringe/drugs,
prob(2);/obj/item/weapon/implanter/sizecontrol,
prob(2);/obj/item/weapon/handcuffs/fuzzy,
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
index 546e67bac6..184f61debd 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
@@ -879,6 +879,20 @@
ckeywhitelist = list("scree")
character_name = list("Scree")
+/datum/gear/fluff/avida_dress
+ path = /obj/item/clothing/under/skirt/outfit/fluff/avida
+ display_name = "Avida's Dress"
+ slot = slot_w_uniform
+ ckeywhitelist = list("scree")
+ character_name = list("Avida")
+
+/datum/gear/fluff/avida_hat
+ path = /obj/item/clothing/head/fluff/avida
+ display_name = "Avida's Hat"
+ slot = slot_head
+ ckeywhitelist = list("scree")
+ character_name = list("Avida")
+
/datum/gear/fluff/alfonso_sunglasses
path = /obj/item/clothing/glasses/sunglasses/fluff/alfonso
display_name = "Alfonso's Sunglasses"
@@ -1024,6 +1038,11 @@
character_name = list("Konor Foxe")
// U CKEYS
+/datum/gear/fluff/brad_jordans
+ path = /obj/item/clothing/shoes/fluff/airjordans
+ display_name = "Bradley's Air Jordans"
+ ckeywhitelist = list("unclefruitvevo")
+ character_name = list("Bradley Khatibi")
// V CKEYS
/datum/gear/fluff/cameron_glasses
diff --git a/code/modules/clothing/glasses/hud_vr.dm b/code/modules/clothing/glasses/hud_vr.dm
index 6093034dd1..272d0863c8 100644
--- a/code/modules/clothing/glasses/hud_vr.dm
+++ b/code/modules/clothing/glasses/hud_vr.dm
@@ -90,10 +90,12 @@
if(icon_state == "glasses")
to_chat(usr, "You darken the electrochromic lenses of \the [src] to one-way transparency.")
name = "[initial(name)] (shaded, pr)"
+ flags_inv |= HIDEEYES
icon_state = "sun"
else if(icon_state == "sun")
to_chat(usr, "You restore the electrochromic lenses of \the [src] to standard two-way transparency.")
name = "[initial(name)] (pr)"
+ flags_inv &= ~HIDEEYES
icon_state = "glasses"
else
to_chat(usr, "The [src] don't seem to support this functionality.")
@@ -101,10 +103,12 @@
if(icon_state == "glasses")
to_chat(usr, "You darken the electrochromic lenses of \the [src] to one-way transparency.")
name = "[initial(name)] (shaded)"
+ flags_inv |= HIDEEYES
icon_state = "sun"
else if(icon_state == "sun")
to_chat(usr, "You restore the electrochromic lenses of \the [src] to standard two-way transparency.")
name = "[initial(name)]"
+ flags_inv &= ~HIDEEYES
icon_state = "glasses"
else
to_chat(usr, "The [src] don't seem to support this functionality.")
@@ -222,7 +226,7 @@
Offers full protection against bright flashes/welders and full access to system alarm monitoring."
mode = "best"
flash_protection = FLASH_PROTECTION_MAJOR
- enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_CH_WANTED)
+ enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_CH_WANTED,VIS_AUGMENTED)
action_button_name = "AR Console (All Alerts)"
tgarscreen_path = /datum/tgui_module/alarm_monitor/all/glasses
diff --git a/code/modules/clothing/gloves/miscellaneous_vr.dm b/code/modules/clothing/gloves/miscellaneous_vr.dm
index a9b21cafc7..9840f116f7 100644
--- a/code/modules/clothing/gloves/miscellaneous_vr.dm
+++ b/code/modules/clothing/gloves/miscellaneous_vr.dm
@@ -60,3 +60,24 @@
name = "knight gauntlets"
icon_state = "brown"
item_state = "brown"
+
+/obj/item/clothing/gloves/heavy_engineer
+ desc = "Elbow-length insulated gloves, with added reinforcement. They'll keep your fingers and forearms just that little bit safer from things that might try to melt, mangle, or burn them. A tag on the inside of each glove reads \'PROPERTY OF ENGINEERING, RETURN IF FOUND\'."
+ name = "heavy-duty engineering gloves"
+ icon_state = "heavy_engi"
+ item_state = "heavy_engi"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.05
+ flags = THICKMATERIAL
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 5, bomb = 0, bio = 30, rad = 30)
+ icon = 'icons/inventory/hands/item_vr.dmi'
+ default_worn_icon = 'icons/inventory/hands/mob_vr.dmi'
+ sprite_sheets = list(
+ SPECIES_TESHARI = 'icons/inventory/hands/mob_vr_teshari.dmi',
+ SPECIES_VOX = 'icons/inventory/hands/mob_vr_vox.dmi',
+ SPECIES_WEREBEAST = 'icons/inventory/hands/mob_vr_werebeast.dmi')
+
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = HANDS
+ max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 0351e16fca..d299396f79 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -529,4 +529,27 @@
/obj/item/clothing/head/wheat
name = "straw hat"
desc = "It's a hat made from synthetic straw. Brought to you by \"Country Girls LLC.\" the choice brand for the galaxy's working class."
- icon_state = "wheat"
\ No newline at end of file
+ icon_state = "wheat"
+
+//Ruin Marine (Doom Marine)
+/obj/item/clothing/head/marine
+ name = "marine helmet"
+ desc = "A marine helmet prop from the popular game 'Ruin'."
+ icon_state = "marine"
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR
+ body_parts_covered = HEAD|FACE|EYES
+
+//Laser Tag Helmets
+/obj/item/clothing/head/bluetag
+ name = "blue laser tag helmet"
+ desc = "Blue Pride, Station Wide."
+ icon_state = "bluetag"
+ flags_inv = HIDEEARS|BLOCKHEADHAIR
+ body_parts_covered = HEAD|EYES
+
+/obj/item/clothing/head/redtag
+ name = "red laser tag helmet"
+ desc = "Reputed to go faster."
+ icon_state = "redtag"
+ flags_inv = HIDEEARS|BLOCKHEADHAIR
+ body_parts_covered = HEAD|EYES
\ No newline at end of file
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 273d76d5fa..50ae396e13 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -13,7 +13,7 @@
*/
/obj/item/clothing/suit/bluetag
- name = "blue laser tag armour"
+ name = "blue laser tag armor"
desc = "Blue Pride, Station Wide."
icon_state = "bluetag"
item_state_slots = list(slot_r_hand_str = "tdblue", slot_l_hand_str = "tdblue")
@@ -22,8 +22,13 @@
allowed = list (/obj/item/weapon/gun/energy/lasertag/blue)
siemens_coefficient = 3.0
+/obj/item/clothing/suit/bluetag/sub
+ name = "Brigader Armor"
+ desc = "Repilca rmor commonly worn by Spacer Union Brigade members from the hit series Spacer Trail. Modified for Laser Tag (Blue Team)."
+ icon_state = "bluetag2"
+
/obj/item/clothing/suit/redtag
- name = "red laser tag armour"
+ name = "red laser tag armor"
desc = "Reputed to go faster."
icon_state = "redtag"
item_state_slots = list(slot_r_hand_str = "tdred", slot_l_hand_str = "tdred")
@@ -32,6 +37,11 @@
allowed = list (/obj/item/weapon/gun/energy/lasertag/red)
siemens_coefficient = 3.0
+/obj/item/clothing/suit/redtag/dom
+ name = "Mu'tu'bi Armor"
+ desc = "Repilca rmor commonly worn by Dominion Of Mu'tu'bi soldiers from the hit series Spacer Trail. Modified for Laser Tag (Red Team)."
+ icon_state = "redtag2"
+
/*
* Costume
*/
@@ -985,3 +995,12 @@
src.item_state = "caution"
usr.show_message("You turn the wet floor sign off.")
update_clothing_icon()
+
+//Ruin Marine (Doom Marine)
+/obj/item/clothing/suit/marine
+ name = "marine armor"
+ desc = "A set of marine prop armor from the popular game 'Ruin'."
+ icon_state = "marine"
+ body_parts_covered = FEET|LOWER_TORSO|UPPER_TORSO|LEGS
+ flags_inv = HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ item_state_slots = list(slot_r_hand_str = "green_labcoat", slot_l_hand_str = "green_labcoat")
diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm
index a72c4b5dfd..d93bb2593a 100644
--- a/code/modules/economy/vending_machines.dm
+++ b/code/modules/economy/vending_machines.dm
@@ -634,7 +634,7 @@
/obj/item/device/flashlight/glowstick/yellow = 3)
contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,
/obj/item/clothing/gloves/fyellow = 2)
- premium = list(/obj/item/clothing/gloves/yellow = 1)
+ premium = list(/obj/item/clothing/gloves/heavy_engineer = 1) //VOREStation Edit - yellow gloves are common in engineering, let's make "premium" actually mean something
req_log_access = access_ce
has_logs = 1
@@ -1144,6 +1144,46 @@
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vending_sound = "machines/vending/vending_cans.ogg"
+///////////////////////Donk-Soft!///////////////////////////////////////
+
+/obj/machinery/vending/donksoft
+ name = "Donk-Soft!"
+ desc = "A toy vendor owned by Donk-Soft, a NanoTrasen sub-company."
+ description_fluff = "Donk-Soft is a sub-company owned by NanoTrasen that distribute replica weapons that shoot squishy foam darts. \
+ They've been a staple of personal entertainment for decades but their buisness has only just moved to the fringes of the galaxy."
+ icon_state = "donksoft"
+ product_slogans = "Get your cool toys today!;Quality toy weapons for cheap prices!"
+ product_ads = "Express your inner child today!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
+ products = list(/obj/item/ammo_magazine/ammo_box/foam = 20,
+ /obj/item/weapon/storage/belt/dbandolier = 5,
+ /obj/item/ammo_magazine/mfoam_dart/pistol = 10,
+ /obj/item/ammo_magazine/mfoam_dart/smg = 10,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy/sawnoff = 5,
+ /obj/item/weapon/gun/projectile/pistol/toy = 5,
+ /obj/item/weapon/gun/projectile/pistol/toy/n99 = 5,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy/big_iron = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 5,
+ /obj/item/weapon/gun/projectile/automatic/toy = 5
+ )
+ contraband = list()
+ prices = list(/obj/item/ammo_magazine/ammo_box/foam = 50,
+ /obj/item/weapon/storage/belt/dbandolier = 100,
+ /obj/item/ammo_magazine/mfoam_dart/pistol = 25,
+ /obj/item/ammo_magazine/mfoam_dart/smg = 25,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy = 250,
+ /obj/item/weapon/gun/projectile/revolver/toy/sawnoff = 150,
+ /obj/item/weapon/gun/projectile/pistol/toy = 100,
+ /obj/item/weapon/gun/projectile/pistol/toy/n99 = 175,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun = 250,
+ /obj/item/weapon/gun/projectile/revolver/toy = 100,
+ /obj/item/weapon/gun/projectile/revolver/toy/big_iron = 175,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 75,
+ /obj/item/weapon/gun/projectile/automatic/toy = 300)
+ vending_sound = "machines/vending/vending_cans.ogg"
+
/*
* Department/job vendors to sit in place of lockers taking up space
*/
diff --git a/code/modules/games/cah_black_cards.dm b/code/modules/games/cah_black_cards.dm
index 0bc5cc6d0f..c2c32b9948 100644
--- a/code/modules/games/cah_black_cards.dm
+++ b/code/modules/games/cah_black_cards.dm
@@ -1,4 +1,6 @@
-// Black cards.
+/*
+ * Black CAH cards
+ */
/obj/item/weapon/deck/cah/black/card_text_list = list(
"Why am I itchy?",
"Today, Security shot ____.",
diff --git a/code/modules/games/cah_white_cards.dm b/code/modules/games/cah_white_cards.dm
index bf0b882b85..9ca72b2d0a 100644
--- a/code/modules/games/cah_white_cards.dm
+++ b/code/modules/games/cah_white_cards.dm
@@ -1,4 +1,6 @@
-// White cards.
+/*
+ * White CAH cards
+ */
/obj/item/weapon/deck/cah/var/list/card_text_list = list(
"Those motherfucking carp",
"Having sex in the maintenance tunnels",
diff --git a/code/modules/games/cardemon.dm b/code/modules/games/cardemon.dm
index a99e656add..0345cf0d18 100644
--- a/code/modules/games/cardemon.dm
+++ b/code/modules/games/cardemon.dm
@@ -1,3 +1,6 @@
+/*
+ * Cardmon trading card game
+ */
/obj/item/weapon/pack/cardemon
name = "cardemon booster pack"
desc = "Finally! A children's card game in space!"
diff --git a/code/modules/games/spaceball_cards.dm b/code/modules/games/spaceball_cards.dm
index d9c932908c..48c5407759 100644
--- a/code/modules/games/spaceball_cards.dm
+++ b/code/modules/games/spaceball_cards.dm
@@ -1,3 +1,6 @@
+/*
+ * Spaceball collectable cards
+ */
/obj/item/weapon/pack/spaceball
name = "spaceball booster pack"
desc = "Officially licensed to take your money."
diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm
index 7c49f7ec43..df5fb73b23 100644
--- a/code/modules/games/tarot.dm
+++ b/code/modules/games/tarot.dm
@@ -1,6 +1,6 @@
-/* this is a playing card deck based off of the Rider-Waite Tarot Deck.
-*/
-
+/*
+ * This is a playing card deck based off of the Rider-Waite Tarot Deck.
+ */
/obj/item/weapon/deck/tarot
name = "deck of tarot cards"
desc = "For all your occult needs!"
diff --git a/code/modules/games/wizoff.dm b/code/modules/games/wizoff.dm
new file mode 100644
index 0000000000..11cf179735
--- /dev/null
+++ b/code/modules/games/wizoff.dm
@@ -0,0 +1,57 @@
+/* It's Wiz-Off, the wizard themed card game!
+ * Each player draws 5 cards. There are five rounds. Each round,
+ * a player selects a card to play, and the winner is selected
+ * based on the following rules:
+ * -Defensive (D) beats Offensive (O)!
+ * -Offensive (O) beats Utility (U)!
+ * -Utility (U) beats Defensive (D)!
+ * -If both players play the same type of spell, the higher number wins!
+ * The player who wins the most of the 5 rounds wins the game!
+ * Now get ready to battle for the fate of the universe: Wiz-Off!
+ */
+
+/obj/item/weapon/deck/wizoff
+ name = "\improper Wiz-Off deck"
+ desc = "A Wiz-Off deck. Fight an arcane battle for the fate of the universe: Draw 5! Play 5! Best of 5!"
+ icon_state = "wizoff"
+
+/obj/item/weapon/deck/wizoff/New()
+ ..()
+ var/datum/playingcard/P
+ for(var/cardtext in card_wiz_list)
+ P = new()
+ P.name = "[cardtext]"
+ P.card_icon = "[icon_state]_card"
+ P.back_icon = "[icon_state]_card_back"
+ cards += P
+
+/obj/item/weapon/deck/wizoff/var/list/card_wiz_list = list(
+ "O1: Spell Cards",
+ "O2: Summon Bees",
+ "O3: Polymorph",
+ "O4: Tesla Blast",
+ "O5: Rod Form",
+ "O6: Mutate",
+ "O7: Fireball",
+ "O8: Mjolnir",
+ "O9: Smite",
+ "D1: Smoke",
+ "D2: Battlemage Armor",
+ "D3: Repulse",
+ "D4: Magic Missile",
+ "D5: Disable Technology",
+ "D6: Spell Trap",
+ "D7: Forcewall",
+ "D8: Arcane Heal",
+ "D9: Stop Time",
+ "U1: Shapechange",
+ "U2: Spacetime Distortion",
+ "U3: Scrying Orb",
+ "U4: Blink",
+ "U5: Knock",
+ "U6: Teleport",
+ "U7: Bind Soul",
+ "U8: Warp Whistle",
+ "U9: Jaunt"
+ )
+
diff --git a/code/modules/materials/materials/metals/steel_vr.dm b/code/modules/materials/materials/metals/steel_vr.dm
index b112f36217..818b41beaa 100644
--- a/code/modules/materials/materials/metals/steel_vr.dm
+++ b/code/modules/materials/materials/metals/steel_vr.dm
@@ -39,44 +39,44 @@
new /datum/stack_recipe("red sofa right", /obj/structure/bed/chair/sofa/right, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("red sofa corner", /obj/structure/bed/chair/sofa/corner, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("brown sofa middle", /obj/structure/bed/chair/sofa/brown, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("brown sofa left", /obj/structure/bed/chair/sofa/brown/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("brown sofa right", /obj/structure/bed/chair/sofa/brown/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("brown sofa corner", /obj/structure/bed/chair/sofa/brown/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("brown sofa left", /obj/structure/bed/chair/sofa/left/brown, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("brown sofa right", /obj/structure/bed/chair/sofa/right/brown, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("brown sofa corner", /obj/structure/bed/chair/sofa/corner/brown, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("teal sofa middle", /obj/structure/bed/chair/sofa/teal, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("teal sofa left", /obj/structure/bed/chair/sofa/teal/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("teal sofa right", /obj/structure/bed/chair/sofa/teal/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("teal sofa corner", /obj/structure/bed/chair/sofa/teal/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("teal sofa left", /obj/structure/bed/chair/sofa/left/teal, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("teal sofa right", /obj/structure/bed/chair/sofa/right/teal, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("teal sofa corner", /obj/structure/bed/chair/sofa/corner/teal, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("black sofa middle", /obj/structure/bed/chair/sofa/black, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("black sofa left", /obj/structure/bed/chair/sofa/black/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("black sofa right", /obj/structure/bed/chair/sofa/black/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("black sofa corner", /obj/structure/bed/chair/sofa/black/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("black sofa left", /obj/structure/bed/chair/sofa/left/black, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("black sofa right", /obj/structure/bed/chair/sofa/right/black, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("black sofa corner", /obj/structure/bed/chair/sofa/corner/black, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("green sofa middle", /obj/structure/bed/chair/sofa/green, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("green sofa left", /obj/structure/bed/chair/sofa/green/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("green sofa right", /obj/structure/bed/chair/sofa/green/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("green sofa corner", /obj/structure/bed/chair/sofa/green/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("green sofa left", /obj/structure/bed/chair/sofa/left/green, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("green sofa right", /obj/structure/bed/chair/sofa/right/green, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("green sofa corner", /obj/structure/bed/chair/sofa/corner/green, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("purple sofa middle", /obj/structure/bed/chair/sofa/purp, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("purple sofa left", /obj/structure/bed/chair/sofa/purp/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("purple sofa right", /obj/structure/bed/chair/sofa/purp/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("purple sofa corner", /obj/structure/bed/chair/sofa/purp/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("purple sofa left", /obj/structure/bed/chair/sofa/left/purp, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("purple sofa right", /obj/structure/bed/chair/sofa/right/purp, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("purple sofa corner", /obj/structure/bed/chair/sofa/corner/purp, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("blue sofa middle", /obj/structure/bed/chair/sofa/blue, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("blue sofa left", /obj/structure/bed/chair/sofa/blue/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("blue sofa right", /obj/structure/bed/chair/sofa/blue/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("blue sofa corner", /obj/structure/bed/chair/sofa/blue/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("blue sofa left", /obj/structure/bed/chair/sofa/left/blue, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("blue sofa right", /obj/structure/bed/chair/sofa/right/blue, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("blue sofa corner", /obj/structure/bed/chair/sofa/corner/blue, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("beige sofa middle", /obj/structure/bed/chair/sofa/beige, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("beige sofa left", /obj/structure/bed/chair/sofa/beige/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("beige sofa right", /obj/structure/bed/chair/sofa/beige/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("beige sofa corner", /obj/structure/bed/chair/sofa/beige/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("beige sofa left", /obj/structure/bed/chair/sofa/left/beige, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("beige sofa right", /obj/structure/bed/chair/sofa/right/beige, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("beige sofa corner", /obj/structure/bed/chair/sofa/corner/beige, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("lime sofa middle", /obj/structure/bed/chair/sofa/lime, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("lime sofa left", /obj/structure/bed/chair/sofa/lime/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("lime sofa right", /obj/structure/bed/chair/sofa/lime/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("lime sofa corner", /obj/structure/bed/chair/sofa/lime/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("lime sofa left", /obj/structure/bed/chair/sofa/left/lime, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("lime sofa right", /obj/structure/bed/chair/sofa/right/lime, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("lime sofa corner", /obj/structure/bed/chair/sofa/corner/lime, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("yellow sofa middle", /obj/structure/bed/chair/sofa/yellow, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("yellow sofa left", /obj/structure/bed/chair/sofa/yellow/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("yellow sofa right", /obj/structure/bed/chair/sofa/yellow/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("yellow sofa corner", /obj/structure/bed/chair/sofa/yellow/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("yellow sofa left", /obj/structure/bed/chair/sofa/left/yellow, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("yellow sofa right", /obj/structure/bed/chair/sofa/right/yellow, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("yellow sofa corner", /obj/structure/bed/chair/sofa/corner/yellow, 1, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("orange sofa middle", /obj/structure/bed/chair/sofa/orange, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("orange sofa left", /obj/structure/bed/chair/sofa/orange/left, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("orange sofa right", /obj/structure/bed/chair/sofa/orange/right, 1, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("orange sofa corner", /obj/structure/bed/chair/sofa/orange/corner, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("orange sofa left", /obj/structure/bed/chair/sofa/left/orange, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("orange sofa right", /obj/structure/bed/chair/sofa/right/orange, 1, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("orange sofa corner", /obj/structure/bed/chair/sofa/corner/orange, 1, one_per_turf = 1, on_floor = 1), \
)),
)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
index f3d35840b0..1622321c52 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
@@ -156,12 +156,13 @@
desc = initial(desc)
icon = initial(icon)
- if(chosen_color)
- color = chosen_color
icon_state = initial(icon_state)
alpha = initial(alpha)
- color = initial(color)
+ if(chosen_color)
+ color = chosen_color
+ else
+ color = initial(color)
plane = initial(plane)
layer = initial(layer)
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
index 41ed65cfac..2e18791beb 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -754,6 +754,16 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/ears/bnnuy2
+ name = "Bnnuy Ears 2"
+ desc = ""
+ icon = 'icons/mob/vore/ears_32x64.dmi'
+ icon_state = "bnnuy2"
+ extra_overlay = "bnnuy-inner"
+ extra_overlay2 = "bnnuy-tips2"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/datum/sprite_accessory/ears/sandfox
name = "Sandfox Ears"
desc = ""
diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm
index 2f0940b7a6..4ba3d6b485 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail.dm
@@ -231,13 +231,6 @@
desc = ""
icon_state = "beethorax"
-/datum/sprite_accessory/tail/doublekitsune
- name = "double kitsune tail, colorable"
- desc = ""
- icon_state = "doublekitsune"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
/datum/sprite_accessory/tail/spade_color
name = "spade-tail (colorable)"
desc = ""
@@ -909,6 +902,20 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/tail/fox_tail
+ name = "Fox tail, colorable"
+ desc = ""
+ icon_state = "fox_tail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/fox_tail_plain
+ name = "Fox tail, colorable, plain"
+ desc = ""
+ icon_state = "fox_tail_plain_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/datum/sprite_accessory/tail/foxtail
name = "Fox tail, colourable (vwag)"
desc = ""
@@ -919,6 +926,21 @@
ani_state = "foxtail_w"
extra_overlay_w = "foxtail-tips_w"
+/datum/sprite_accessory/tail/doublekitsune
+ name = "Kitsune 2 tails, colorable"
+ desc = ""
+ icon_state = "doublekitsune"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/doublekitsunealt
+ name = "Kitsune 2 tails, colorable, alt"
+ desc = ""
+ icon_state = "doublekitsunealt"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "doublekitsunealt-tips"
+
/datum/sprite_accessory/tail/triplekitsune_colorable
name = "Kitsune 3 tails, colorable"
desc = ""
@@ -927,6 +949,14 @@
color_blend_mode = ICON_MULTIPLY
extra_overlay = "triplekitsune_tips"
+/datum/sprite_accessory/tail/sevenkitsune_colorable
+ name = "Kitsune 7 tails, colorable"
+ desc = ""
+ icon_state = "sevenkitsune"
+ extra_overlay = "sevenkitsune-tips"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/datum/sprite_accessory/tail/ninekitsune_colorable
name = "Kitsune 9 tails, colorable"
desc = ""
diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
index 9bbdc8240c..82459ead5d 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
@@ -211,13 +211,6 @@
desc = ""
icon_state = "beethorax"
-/datum/sprite_accessory/tail/doublekitsune
- name = "double kitsune tail, colorable"
- desc = ""
- icon_state = "doublekitsune"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
/datum/sprite_accessory/tail/spade_color
name = "spade-tail (colorable)"
desc = ""
@@ -964,6 +957,52 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/tail/fennec_tail
+ name = "Fennec tail"
+ desc = ""
+ icon_state = "fennec_tail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/fox_tail
+ name = "Fox tail, colorable"
+ desc = ""
+ icon_state = "fox_tail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/fox_tail_plain
+ name = "Fox tail, colorable, plain"
+ desc = ""
+ icon_state = "fox_tail_plain_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/foxtail
+ name = "Fox tail, colourable (vwag)"
+ desc = ""
+ icon_state = "foxtail"
+ extra_overlay = "foxtail-tips"
+ do_colouration = TRUE
+ color_blend_mode = ICON_MULTIPLY
+ ani_state = "foxtail_w"
+ extra_overlay_w = "foxtail-tips_w"
+
+/datum/sprite_accessory/tail/doublekitsune
+ name = "Kitsune 2 tails, colorable"
+ desc = ""
+ icon_state = "doublekitsune"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/doublekitsunealt
+ name = "Kitsune 2 tails, colorable, alt"
+ desc = ""
+ icon_state = "doublekitsunealt"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "doublekitsunealt-tips"
+
/datum/sprite_accessory/tail/triplekitsune_colorable
name = "Kitsune 3 tails, colorable"
desc = ""
@@ -972,6 +1011,14 @@
color_blend_mode = ICON_MULTIPLY
extra_overlay = "triplekitsune_tips"
+/datum/sprite_accessory/tail/sevenkitsune_colorable
+ name = "Kitsune 7 tails, colorable"
+ desc = ""
+ icon_state = "sevenkitsune"
+ extra_overlay = "sevenkitsune-tips"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/datum/sprite_accessory/tail/ninekitsune_colorable
name = "Kitsune 9 tails, colorable"
desc = ""
@@ -980,6 +1027,16 @@
color_blend_mode = ICON_MULTIPLY
extra_overlay = "ninekitsune-tips"
+/datum/sprite_accessory/tail/hideableninetails
+ name = "Kitsune 9-in-1 tail, colourable (vwag)"
+ desc = ""
+ icon_state = "ninekitsune"
+ extra_overlay = "ninekitsune-tips"
+ do_colouration = TRUE
+ color_blend_mode = ICON_MULTIPLY
+ ani_state = "foxtail_w"
+ extra_overlay_w = "foxtail-tips_w"
+
/datum/sprite_accessory/tail/shadekin_short
name = "Shadekin Short Tail, colorable"
desc = ""
@@ -1058,27 +1115,6 @@
ani_state = "Segmentedtail_w"
extra_overlay_w = "Segmentedlights_w"
-/datum/sprite_accessory/tail/fox_tail
- name = "Fox tail"
- desc = ""
- icon_state = "fox_tail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/fox_tail_plain
- name = "Fox tail"
- desc = ""
- icon_state = "fox_tail_plain_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/fennec_tail
- name = "Fennec tail"
- desc = ""
- icon_state = "fennec_tail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
/datum/sprite_accessory/tail/lizard_tail_smooth
name = "Lizard Tail (Smooth)"
desc = ""
@@ -1146,7 +1182,7 @@
icon_state = "tentacle"
ani_state = "tentacle_w"
do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
+ color_blend_mode = ICON_MULTIPLY
//LONG TAILS ARE NOT TAUR BUTTS >:O
/datum/sprite_accessory/tail/longtail
diff --git a/code/modules/persistence/effects/trash.dm b/code/modules/persistence/effects/trash.dm
index 951e9858af..3eaa121711 100644
--- a/code/modules/persistence/effects/trash.dm
+++ b/code/modules/persistence/effects/trash.dm
@@ -4,6 +4,10 @@
/datum/persistent/filth/trash/CheckTurfContents(var/turf/T, var/list/tokens)
var/too_much_trash = 0
for(var/obj/item/trash/trash in T)
+ //VOREStation Addition Start
+ if(istype(T, /obj/item/trash/spitwad) || istype(T, /obj/item/trash/spitgum))
+ return FALSE
+ //VOREStation Addition End
too_much_trash++
if(too_much_trash >= 5)
return FALSE
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 67524ac86c..46736474b7 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -246,3 +246,39 @@
magazine_icondata_keys[M.type] = icon_keys
magazine_icondata_states[M.type] = ammo_states
+/*
+ * Ammo Boxes
+ */
+
+/obj/item/ammo_magazine/ammo_box
+ name = "ammo box"
+ desc = "A box that holds some kind of ammo."
+ icon = 'icons/obj/ammo_boxes.dmi'
+ icon_state = "pistol"
+ slot_flags = null //You can't fit a box on your belt
+ item_state = "paper"
+ matter = null
+ throwforce = 3
+ throw_speed = 5
+ throw_range = 12
+ preserve_item = 1
+ caliber = ".357"
+ drop_sound = 'sound/items/drop/matchbox.ogg'
+ pickup_sound = 'sound/items/pickup/matchbox.ogg'
+
+/obj/item/ammo_magazine/ammo_box/AltClick(mob/user)
+ if(can_remove_ammo)
+ if(isliving(user) && Adjacent(user))
+ if(stored_ammo.len)
+ var/obj/item/ammo_casing/C = stored_ammo[stored_ammo.len]
+ stored_ammo-=C
+ user.put_in_hands(C)
+ user.visible_message("\The [user] removes \a [C] from [src].", "You remove \a [C] from [src].")
+ update_icon()
+ return
+ ..()
+
+/obj/item/ammo_magazine/ammo_box/examine(mob/user)
+ . = ..()
+
+ . += to_chat(usr, "Alt-click to extract contents")
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/ammo_boxes.dm b/code/modules/projectiles/ammunition/ammo_boxes.dm
new file mode 100644
index 0000000000..332b634a0f
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ammo_boxes.dm
@@ -0,0 +1,58 @@
+/************************************************************************/
+/*
+# An explaination of the naming format for guns and ammo:
+#
+# a = Ammo, as in individual rounds of ammunition.
+# b = Box, intended to have ammo taken out one at a time by hand.
+# c = Clips, intended to reload magazines or guns quickly.
+# m = Magazine, intended to hold rounds of ammo.
+# s = Speedloaders, intended to reload guns quickly.
+#
+# Use this format, followed by the caliber. For example, a shotgun's caliber
+# variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g",
+# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion
+# for developers and in-game admins spawning these items, stick to this format.
+# Likewise, when creating new rounds, the caliber variable should match whatever
+# the name says.
+#
+# This comment is copied in rounds.dm and magazines.dm as well.
+#
+# Also, to remove bullets from ammo boxes, use Alt-Click on the box.
+*/
+/************************************************************************/
+
+/*
+ * Foam
+ */
+
+/obj/item/ammo_magazine/ammo_box/foam
+ name = "\improper Donk-Soft ammo box"
+ desc = "Contains Donk-Soft foam darts. It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foambox"
+ caliber = "foam"
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ matter = list(MAT_PLASTIC = 1800)
+ max_ammo = 30
+ multiple_sprites = null
+
+/obj/item/ammo_magazine/ammo_box/foam/riot
+ name = "\improper Donk-Soft riot ammo box"
+ desc = "Contains Donk-Soft riot darts. It's Donk or Don't! Ages 18 and up."
+ icon_state = "foambox_riot"
+ matter = list(MAT_STEEL = 5040, MAT_PLASTIC = 1800)
+
+/*
+ * Cap
+ */
+
+/obj/item/ammo_magazine/ammo_box/cap
+ name = "\improper AlliCo SNAP! Caps"
+ desc = "A box of spare caps for capguns. Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "capbox"
+ caliber = "caps"
+ ammo_type = /obj/item/ammo_casing/cap
+ matter = list(MAT_STEEL = 2040)
+ max_ammo = 24
+ multiple_sprites = null
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 41b000d82f..aa43a54792 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -22,7 +22,42 @@
*/
/************************************************************************/
+///////// Foam /////////
+/obj/item/ammo_magazine/mfoam_dart/pistol
+ name = "\improper Donk-Soft pistol magazine"
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "toy"
+ mag_type = MAGAZINE
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ matter = list(MAT_PLASTIC = 250)
+ caliber = "foam"
+ max_ammo = 9
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/mfoam_dart/pistol/riot
+ ammo_type = /obj/item/ammo_casing/afoam_dart/riot
+
+/obj/item/ammo_magazine/mfoam_dart/pistol/empty
+ initial_ammo = 0
+
+/obj/item/ammo_magazine/mfoam_dart/smg
+ name = "\improper Donk-Soft smg magazine"
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "toysmg"
+ mag_type = MAGAZINE
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ matter = list(MAT_PLASTIC = 250)
+ caliber = "foam"
+ max_ammo = 20
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/mfoam_dart/smg/riot
+ ammo_type = /obj/item/ammo_casing/afoam_dart/riot
+ matter = list(MAT_PLASTIC = 1260, MAT_PLASTIC = 250)
+
+/obj/item/ammo_magazine/mfoam_dart/smg/empty
+ initial_ammo = 0
///////// .357 /////////
diff --git a/code/modules/projectiles/ammunition/rounds.dm b/code/modules/projectiles/ammunition/rounds.dm
index c10cf8f7b3..0ea73396f8 100644
--- a/code/modules/projectiles/ammunition/rounds.dm
+++ b/code/modules/projectiles/ammunition/rounds.dm
@@ -19,6 +19,26 @@
*/
/************************************************************************/
+/*
+ * Foam
+ */
+
+/obj/item/ammo_casing/afoam_dart
+ name = "foam dart"
+ desc = "It's Donk or Don't! Ages 8 and up."
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ matter = list(MAT_PLASTIC = 60)
+ caliber = "foam"
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamdart"
+ caseless = 1
+
+/obj/item/ammo_casing/afoam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ matter = list(MAT_STEEL = 210, MAT_PLASTIC = 60)
+ icon_state = "foamdart_riot"
+
/*
* .357
*/
@@ -427,12 +447,13 @@
/obj/item/ammo_casing/cap
name = "cap"
- desc = "A cap for children toys."
+ desc = "A cap for children toys. Ages 8 and up."
caliber = "caps"
- icon_state = "r-casing"
- color = "#FF0000"
- projectile_type = /obj/item/projectile/bullet/pistol/cap
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "cap"
+ projectile_type = /obj/item/projectile/bullet/cap
matter = list(MAT_STEEL = 85)
+ caseless = 1
/obj/item/ammo_casing/spent // For simple hostile mobs only, so they don't cough up usable bullets when firing. This is for literally nothing else.
icon_state = "s-casing-spent"
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 318a244cea..a94a07c225 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -261,41 +261,6 @@
accuracy = 0
scoped_accuracy = 20
-////////Laser Tag////////////////////
-
-/obj/item/weapon/gun/energy/lasertag
- name = "laser tag gun"
- item_state = "laser"
- desc = "Standard issue weapon of the Imperial Guard"
- origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
- matter = list(MAT_STEEL = 2000)
- projectile_type = /obj/item/projectile/beam/lasertag/blue
- cell_type = /obj/item/weapon/cell/device/weapon/recharge
- battery_lock = 1
- var/required_vest
-
-/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
- if(ishuman(M))
- if(!istype(M.wear_suit, required_vest))
- to_chat(M, "You need to be wearing your laser tag vest!")
- return 0
- return ..()
-
-/obj/item/weapon/gun/energy/lasertag/blue
- icon_state = "bluetag"
- item_state = "bluetag"
- projectile_type = /obj/item/projectile/beam/lasertag/blue
- required_vest = /obj/item/clothing/suit/bluetag
-
-/obj/item/weapon/gun/energy/lasertag/red
- icon_state = "redtag"
- item_state = "redtag"
- projectile_type = /obj/item/projectile/beam/lasertag/red
- required_vest = /obj/item/clothing/suit/redtag
-
-/obj/item/weapon/gun/energy/lasertag/omni
- projectile_type = /obj/item/projectile/beam/lasertag/omni
-
// Laser scattergun, proof of concept.
/obj/item/weapon/gun/energy/lasershotgun
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 8ff8cdc518..f6033a8e59 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -149,18 +149,6 @@
flick("deckard-reload",src)
..()
-/obj/item/weapon/gun/projectile/revolver/capgun
- name = "cap gun"
- desc = "Looks almost like the real thing! Ages 8 and up."
- icon_state = "revolver"
- item_state = "revolver"
- caliber = "caps"
- origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
- handle_casings = CYCLE_CASINGS
- max_shells = 7
- ammo_type = /obj/item/ammo_casing/cap
- projectile_type = /obj/item/projectile/bullet/pistol/strong
-
/obj/item/weapon/gun/projectile/revolver/judge
name = "\"The Judge\""
desc = "A revolving hand-shotgun by Jindal Arms that packs the power of a 12 guage in the palm of your hand (if you don't break your wrist). Uses 12g rounds."
diff --git a/code/modules/projectiles/guns/toy.dm b/code/modules/projectiles/guns/toy.dm
new file mode 100644
index 0000000000..e3b90bd1be
--- /dev/null
+++ b/code/modules/projectiles/guns/toy.dm
@@ -0,0 +1,251 @@
+/* Toys Guns!
+ *
+ * Contains:
+ * Cap Gun
+ * Shotgun
+ * Pistol
+ * N99 Pistol
+ * Levergun
+ * Revolver
+ * Big Iron
+ * Crossbow
+ * Crossbow (Halloween)
+ * Sawn Off
+ * SMG
+ * Laser Tag
+ */
+
+/*
+ * Cap Gun
+ */
+/obj/item/weapon/gun/projectile/revolver/capgun
+ name = "cap gun"
+ desc = "Looks almost like the real thing! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "cap_gun"
+ item_state = "revolver"
+ caliber = "caps"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ ammo_type = /obj/item/ammo_casing/cap
+ projectile_type = /obj/item/projectile/bullet/cap
+ matter = list(MAT_STEEL = 1000)
+ handle_casings = null
+ recoil = 1 //it's a toy
+
+/*
+ * Shotgun
+ */
+/obj/item/weapon/gun/projectile/shotgun/pump/toy
+ name = "\improper Donk-Soft shotgun"
+ desc = "Donk-Soft foam shotgun! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "shotgun"
+ item_state = "shotgun"
+ max_shells = 6
+ w_class = ITEMSIZE_LARGE
+ force = 2
+ slot_flags = null
+ caliber = "foam"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ load_method = SINGLE_CASING
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ matter = list(MAT_PLASTIC = 2000)
+ handle_casings = null
+ recoil = null //it's a toy
+
+/*
+ * Pistol
+ */
+/obj/item/weapon/gun/projectile/pistol/toy
+ name = "\improper Donk-Soft pistol"
+ desc = "Donk-Soft foam pistol! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "pistol"
+ item_state = "gun"
+ magazine_type = /obj/item/ammo_magazine/mfoam_dart/pistol
+ allowed_magazines = list(/obj/item/ammo_magazine/mfoam_dart/pistol)
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ caliber = "foam"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ load_method = MAGAZINE
+ matter = list(MAT_PLASTIC = 1000)
+ recoil = null //it's a toy
+
+/obj/item/weapon/gun/projectile/pistol/toy/update_icon()
+ if(ammo_magazine)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-e"
+
+/*
+ * N99 Pistol
+ */
+/obj/item/weapon/gun/projectile/pistol/toy/n99
+ name = "\improper Donk-Soft commemorative pistol"
+ desc = "A special made Donk-Soft pistol to promote 'Radius: Legend of the Demon Core', a popular post-apocolyptic TV series."
+ icon_state = "n99"
+ item_state = "gun"
+
+/obj/item/weapon/gun/projectile/pistol/toy/n99/update_icon()
+ if(ammo_magazine)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-e"
+
+/*
+ * Levergun
+ */
+/obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun
+ name = "\improper Donk-Soft levergun"
+ desc = "Donk-Soft foam levergun! Time to cowboy up! Ages 8 and up."
+ icon_state = "leveraction"
+ item_state = "leveraction"
+ max_shells = 5
+ pump_animation = "leveraction-cycling"
+
+/*
+ * Revolver
+ */
+/obj/item/weapon/gun/projectile/revolver/toy
+ name = "\improper Donk-Soft revolver"
+ desc = "Donk-Soft foam revolver! Time to cowboy up! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "revolver"
+ item_state = "revolver"
+ caliber = "foam"
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ load_method = SINGLE_CASING
+ max_shells = 6
+ matter = list(MAT_PLASTIC = 1000)
+ handle_casings = null
+ recoil = null //it's a toy
+
+/*
+ * Big Iron
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/big_iron
+ name = "\improper Donk-Soft big iron"
+ desc = "A special made Donk-Soft pistol to promote 'A Fistful of Phoron', a popular frontier novel series."
+ icon_state = "big_iron"
+ item_state = "revolver"
+
+/*
+ * Crossbow
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow
+ name = "\improper Donk-Soft crossbow"
+ desc = "Donk-Soft foam crossbow! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamcrossbow"
+ item_state = "foamcrossbow"
+ max_shells = 5
+
+/*
+ * Crossbow (Halloween)
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow/halloween
+ name = "\improper Donk-Soft special edition crossbow"
+ desc = "A special edition Donk-Soft crossbow! Made special for your Halloween cosplay. It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamcrossbow_halloween"
+ item_state = "foamcrossbow_halloween"
+ max_shells = 5
+
+/*
+ * Sawn Off
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/sawnoff //revolver code just because it's easier
+ name = "\improper Donk-Soft sawn off shotgun"
+ desc = "Donk-Soft foam sawn off! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "sawnshotgun"
+ item_state = "dshotgun"
+ max_shells = 2
+ w_class = ITEMSIZE_NORMAL
+ matter = list(MAT_PLASTIC = 1500)
+
+/*
+ * SMG
+ */
+/obj/item/weapon/gun/projectile/automatic/toy
+ name = "\improper Donk-Soft SMG"
+ desc = "Donk-Soft foam SMG! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "smg"
+ caliber = "foam"
+ w_class = ITEMSIZE_NORMAL
+ load_method = MAGAZINE
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ slot_flags = SLOT_BELT
+ magazine_type = /obj/item/ammo_magazine/mfoam_dart/smg
+ allowed_magazines = list(/obj/item/ammo_magazine/mfoam_dart/smg)
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ matter = list(MAT_PLASTIC = 1500)
+ recoil = null //it's a toy
+
+ firemodes = list(
+ list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
+ list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=2, burst_accuracy=list(0,-2,-2), dispersion=null)
+ )
+
+/obj/item/weapon/gun/projectile/automatic/toy/riot
+ magazine_type = /obj/item/ammo_magazine/mfoam_dart/smg/riot
+
+/obj/item/weapon/gun/projectile/automatic/toy/update_icon()
+ if(ammo_magazine)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-e"
+
+/*
+ * Laser Tag
+ */
+/obj/item/weapon/gun/energy/lasertag
+ name = "laser tag gun"
+ desc = "Standard issue weapon of the Imperial Guard"
+ icon = 'icons/obj/gun_toy.dmi'
+ item_state = "omnitag"
+ item_state = "retro"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
+ matter = list(MAT_STEEL = 2000)
+ projectile_type = /obj/item/projectile/beam/lasertag/blue
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
+ var/required_vest
+
+/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
+ if(ishuman(M))
+ if(!istype(M.wear_suit, required_vest))
+ to_chat(M, "You need to be wearing your laser tag vest!")
+ return 0
+ return ..()
+
+/obj/item/weapon/gun/energy/lasertag/blue
+ icon_state = "bluetag"
+ item_state = "bluetag"
+ projectile_type = /obj/item/projectile/beam/lasertag/blue
+ required_vest = /obj/item/clothing/suit/bluetag
+
+/obj/item/weapon/gun/energy/lasertag/blue/sub
+ name = "Brigader Sidearm"
+ desc = "A laser tag replica of the standard issue weapon for the Spacer Union Brigade from the hit series Spacer Trail (Blue Team)."
+ icon_state = "bluetwo"
+ item_state = "retro"
+
+/obj/item/weapon/gun/energy/lasertag/red
+ icon_state = "redtag"
+ item_state = "redtag"
+ projectile_type = /obj/item/projectile/beam/lasertag/red
+ required_vest = /obj/item/clothing/suit/redtag
+
+/obj/item/weapon/gun/energy/lasertag/red/dom
+ name = "Mu'tu'bi sidearm"
+ desc = "A laser tag replica of the Mu'tu'bi sidearm from the hit series Spacer Trail (Red Team)."
+ icon_state = "redtwo"
+ item_state = "retro"
+
+/obj/item/weapon/gun/energy/lasertag/omni
+ projectile_type = /obj/item/projectile/beam/lasertag/omni
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index a642889f04..a97d843961 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -322,10 +322,6 @@
embed_chance = 0
sharp = FALSE
-/obj/item/projectile/bullet/blank/cap/process()
- loc = null
- qdel(src)
-
/* BB Rounds */
/obj/item/projectile/bullet/bb // Generic single BB
name = "BB"
@@ -344,4 +340,54 @@
pellets = 6
range_step = 1
spread_step = 10
- silenced = TRUE
\ No newline at end of file
+ silenced = TRUE
+
+/* toy projectiles */
+/obj/item/projectile/bullet/cap
+ name = "cap"
+ desc = "SNAP!"
+ damage = 0 // It's a damn toy.
+ embed_chance = 0
+ nodamage = TRUE
+ sharp = FALSE
+ damage_type = HALLOSS
+ impact_effect_type = null
+ fire_sound = 'sound/effects/snap.ogg'
+ combustion = FALSE
+
+/obj/item/projectile/bullet/cap/process()
+ loc = null
+ qdel(src)
+
+/obj/item/projectile/bullet/foam_dart
+ name = "foam dart"
+ desc = "I hope you're wearing eye protection."
+ damage = 0 // It's a damn toy.
+ embed_chance = 0
+ nodamage = TRUE
+ sharp = FALSE
+ damage_type = HALLOSS
+ impact_effect_type = null
+ fire_sound = 'sound/items/syringeproj.ogg'
+ combustion = FALSE
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamdart_proj"
+ range = 15
+
+/obj/item/projectile/bullet/foam_dart/on_impact(var/atom/A)
+ . = ..()
+ var/turf/T = get_turf(loc)
+ if(istype(T))
+ new /obj/item/ammo_casing/afoam_dart(get_turf(loc))
+
+/obj/item/projectile/bullet/foam_dart/on_range(var/atom/A)
+ . = ..()
+ var/turf/T = get_turf(loc)
+ if(istype(T))
+ new /obj/item/ammo_casing/afoam_dart(get_turf(loc))
+
+/obj/item/projectile/bullet/foam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ agony = 50
+ icon_state = "foamdart_riot_proj"
\ No newline at end of file
diff --git a/code/modules/reagents/machinery/dispenser/reagent_tank.dm b/code/modules/reagents/machinery/dispenser/reagent_tank.dm
index 42677feb07..7f591217c8 100644
--- a/code/modules/reagents/machinery/dispenser/reagent_tank.dm
+++ b/code/modules/reagents/machinery/dispenser/reagent_tank.dm
@@ -155,6 +155,20 @@
icon_state = "barrel"
modded = TRUE
+/obj/structure/reagent_dispensers/fueltank/barrel/two
+ name = "explosive barrel"
+ desc = "A barrel with warning labels painted all over it."
+ icon = 'icons/obj/objects_vr.dmi'
+ icon_state = "barrel2"
+ modded = FALSE
+
+/obj/structure/reagent_dispensers/fueltank/barrel/three
+ name = "fuel barrel"
+ desc = "An open-topped barrel full of nasty-looking liquid."
+ icon = 'icons/obj/objects_vr.dmi'
+ icon_state = "barrel3"
+ modded = FALSE
+
/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (W.is_wrench()) //can't wrench it shut, it's always open
return
diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm
index 826925caaa..25f4162d2c 100644
--- a/code/modules/reagents/reagents/_reagents.dm
+++ b/code/modules/reagents/reagents/_reagents.dm
@@ -48,12 +48,15 @@
// This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing.
/datum/reagent/proc/touch_mob(var/mob/M, var/amount)
+ SEND_SIGNAL(M, COMSIG_REAGENTS_TOUCH, src, amount)
return
/datum/reagent/proc/touch_obj(var/obj/O, var/amount) // Acid melting, cleaner cleaning, etc
+ SEND_SIGNAL(O, COMSIG_REAGENTS_TOUCH, src, amount)
return
/datum/reagent/proc/touch_turf(var/turf/T, var/amount) // Cleaner cleaning, lube lubbing, etc, all go here
+ SEND_SIGNAL(T, COMSIG_REAGENTS_TOUCH, src, amount)
return
/datum/reagent/proc/on_mob_life(var/mob/living/carbon/M, var/alien, var/datum/reagents/metabolism/location) // Currently, on_mob_life is called on carbons. Any interaction with non-carbon mobs (lube) will need to be done in touch_mob.
diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm
index 4b2744c823..901b803cbb 100644
--- a/code/modules/reagents/reagents/core.dm
+++ b/code/modules/reagents/reagents/core.dm
@@ -31,6 +31,9 @@
/datum/reagent/blood/touch_turf(var/turf/simulated/T)
if(!istype(T) || volume < 3)
return
+
+ ..()
+
if(!data["donor"] || istype(data["donor"], /mob/living/carbon/human))
blood_splatter(T, src, 1)
else if(istype(data["donor"], /mob/living/carbon/alien))
@@ -169,6 +172,8 @@
if(!istype(T))
return
+ ..()
+
var/datum/gas_mixture/environment = T.return_air()
var/min_temperature = T0C + 100 // 100C, the boiling point of water
@@ -190,14 +195,19 @@
T.wet_floor(1)
/datum/reagent/water/touch_obj(var/obj/O, var/amount)
+ ..()
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
+ else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/cube))
+ var/obj/item/weapon/reagent_containers/food/snacks/cube/cube = O
+ cube.Expand()
else
O.water_act(amount / 5)
/datum/reagent/water/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
// First, kill slimes.
if(istype(L, /mob/living/simple_mob/slime))
@@ -252,6 +262,7 @@
glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption."
/datum/reagent/fuel/touch_turf(var/turf/T, var/amount)
+ ..()
new /obj/effect/decal/cleanable/liquid_fuel(T, amount, FALSE)
remove_self(amount)
return
@@ -261,5 +272,6 @@
M.adjustToxLoss(4 * removed)
/datum/reagent/fuel/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 10) // Splashing people with welding fuel to make them easy to ignite!
diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm
index b243a4768c..e64d00ba9d 100644
--- a/code/modules/reagents/reagents/dispenser.dm
+++ b/code/modules/reagents/reagents/dispenser.dm
@@ -49,6 +49,7 @@
M.ingested.remove_reagent(R.id, removed * effect)
/datum/reagent/carbon/touch_turf(var/turf/T)
+ ..()
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, T)
if (!dirtoverlay)
@@ -106,6 +107,7 @@
allergen_factor = 0.5 //simulates mixed drinks containing less of the allergen, as they have only a single actual reagent unlike food
/datum/reagent/ethanol/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 15)
@@ -199,6 +201,7 @@
M.hallucination = max(M.hallucination, halluci)
/datum/reagent/ethanol/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/item/weapon/paper))
var/obj/item/weapon/paper/paperaffected = O
paperaffected.clearpaper()
@@ -342,6 +345,7 @@
M.adjustToxLoss(100)
/datum/reagent/radium/touch_turf(var/turf/T)
+ ..()
if(volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T)
@@ -430,6 +434,7 @@
M.take_organ_damage(0, removed * power * 0.1) // Balance. The damage is instant, so it's weaker. 10 units -> 5 damage, double for pacid. 120 units beaker could deal 60, but a) it's burn, which is not as dangerous, b) it's a one-use weapon, c) missing with it will splash it over the ground and d) clothes give some protection, so not everything will hit
/datum/reagent/acid/touch_obj(var/obj/O)
+ ..()
if(O.unacidable)
return
if((istype(O, /obj/item) || istype(O, /obj/effect/plant)) && (volume > meltdose))
diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm
index d26f0fa312..dce54e588d 100644
--- a/code/modules/reagents/reagents/food_drinks.dm
+++ b/code/modules/reagents/reagents/food_drinks.dm
@@ -170,6 +170,8 @@
if(!istype(T))
return
+ ..()
+
var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space))
var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles)
@@ -386,6 +388,7 @@
allergen_type = ALLERGEN_GRAINS //Flour is made from grain
/datum/reagent/nutriment/flour/touch_turf(var/turf/simulated/T)
+ ..()
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/flour(T)
@@ -565,6 +568,7 @@
glass_desc = "Durian paste. It smells horrific."
/datum/reagent/nutriment/durian/touch_mob(var/mob/M, var/amount)
+ ..()
if(iscarbon(M) && !M.isSynthetic())
var/message = pick("Oh god, it smells disgusting here.", "What is that stench?", "That's an awful odor.")
to_chat(M, "[message]")
@@ -574,6 +578,7 @@
return ..()
/datum/reagent/nutriment/durian/touch_turf(var/turf/T, var/amount)
+ ..()
if(istype(T))
var/obj/effect/decal/cleanable/chemcoating/C = new /obj/effect/decal/cleanable/chemcoating(T)
C.reagents.add_reagent(id, amount)
diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm
index c8ac604ba7..5387a74e60 100644
--- a/code/modules/reagents/reagents/medicine.dm
+++ b/code/modules/reagents/reagents/medicine.dm
@@ -346,6 +346,7 @@
M.adjustToxLoss(3 * removed)
/datum/reagent/tricorlidaze/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/item/stack/medical/bruise_pack) && round(volume) >= 5)
var/obj/item/stack/medical/bruise_pack/C = O
var/packname = C.name
@@ -1281,6 +1282,7 @@
M.add_chemical_effect(CE_PAINKILLER, 20 * M.species.chem_strength_pain) // 5 less than paracetamol.
/datum/reagent/spacomycaze/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/item/stack/medical/crude_pack) && round(volume) >= 1)
var/obj/item/stack/medical/crude_pack/C = O
var/packname = C.name
@@ -1317,10 +1319,12 @@
M.adjustToxLoss(2 * removed)
/datum/reagent/sterilizine/touch_obj(var/obj/O)
+ ..()
O.germ_level -= min(volume*20, O.germ_level)
O.was_bloodied = null
/datum/reagent/sterilizine/touch_turf(var/turf/T)
+ ..()
T.germ_level -= min(volume*20, T.germ_level)
for(var/obj/item/I in T.contents)
I.was_bloodied = null
@@ -1334,6 +1338,7 @@
//VOREstation edit end
/datum/reagent/sterilizine/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
if(istype(L, /mob/living/simple_mob/slime))
var/mob/living/simple_mob/slime/S = L
diff --git a/code/modules/reagents/reagents/modifiers.dm b/code/modules/reagents/reagents/modifiers.dm
index bed5da5f47..22b1f047c7 100644
--- a/code/modules/reagents/reagents/modifiers.dm
+++ b/code/modules/reagents/reagents/modifiers.dm
@@ -42,6 +42,7 @@
affect_blood(M, alien, removed * 0.6)
/datum/reagent/modapplying/cryofluid/touch_mob(var/mob/M, var/amount)
+ ..()
if(isliving(M))
var/mob/living/L = M
for(var/I = 1 to rand(1, round(amount + 1)))
@@ -49,6 +50,7 @@
return
/datum/reagent/modapplying/cryofluid/touch_turf(var/turf/T, var/amount)
+ ..()
if(istype(T, /turf/simulated/floor/water) && prob(amount))
T.visible_message("\The [T] crackles loudly as the cryogenic fluid causes it to boil away, leaving behind a hard layer of ice.")
T.ChangeTurf(/turf/simulated/floor/outdoors/ice, 1, 1, TRUE)
diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm
index 6b219ae243..fbdd1c556d 100644
--- a/code/modules/reagents/reagents/other.dm
+++ b/code/modules/reagents/reagents/other.dm
@@ -114,14 +114,17 @@
color_weight = 20
/datum/reagent/paint/touch_turf(var/turf/T)
+ ..()
if(istype(T) && !istype(T, /turf/space))
T.color = color
/datum/reagent/paint/touch_obj(var/obj/O)
+ ..()
if(istype(O))
O.color = color
/datum/reagent/paint/touch_mob(var/mob/M)
+ ..()
if(istype(M) && !istype(M, /mob/observer)) //painting ghosts: not allowed
M.color = color //maybe someday change this to paint only clothes and exposed body parts for human mobs.
@@ -267,6 +270,7 @@
M.apply_effect(5 * removed, IRRADIATE, 0)
/datum/reagent/uranium/touch_turf(var/turf/T)
+ ..()
if(volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T)
@@ -288,7 +292,7 @@
name = "Lithium-6"
id = "lithium6"
description = "An isotope of lithium. It has 3 neutrons, but shares all chemical characteristics with regular lithium."
-
+
/datum/reagent/helium/helium3
name = "Helium-3"
id = "helium3"
@@ -321,11 +325,11 @@
/datum/reagent/supermatter/affect_ingest(mob/living/carbon/M, alien, removed)
. = ..()
M.ash()
-
+
/datum/reagent/supermatter/affect_blood(mob/living/carbon/M, alien, removed)
. = ..()
M.ash()
-
+
/datum/reagent/adrenaline
name = "Adrenaline"
@@ -361,6 +365,7 @@
cult.remove_antagonist(M.mind)
/datum/reagent/water/holywater/touch_turf(var/turf/T)
+ ..()
if(volume >= 5)
T.holy = 1
return
@@ -408,6 +413,7 @@
touch_met = 50
/datum/reagent/thermite/touch_turf(var/turf/T)
+ ..()
if(volume >= 5)
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
@@ -417,6 +423,7 @@
return
/datum/reagent/thermite/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 5)
@@ -433,14 +440,17 @@
touch_met = 50
/datum/reagent/space_cleaner/touch_mob(var/mob/M)
+ ..()
if(iscarbon(M))
var/mob/living/carbon/C = M
C.clean_blood()
/datum/reagent/space_cleaner/touch_obj(var/obj/O)
+ ..()
O.clean_blood()
/datum/reagent/space_cleaner/touch_turf(var/turf/T)
+ ..()
if(volume >= 1)
if(istype(T, /turf/simulated))
var/turf/simulated/S = T
@@ -488,6 +498,7 @@
M.vomit()
/datum/reagent/space_cleaner/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L, /mob/living/carbon/human))
var/mob/living/carbon/human/H = L
if(H.wear_mask)
@@ -506,6 +517,7 @@
color = "#009CA8"
/datum/reagent/lube/touch_turf(var/turf/simulated/T)
+ ..()
if(!istype(T))
return
if(volume >= 1)
@@ -520,6 +532,7 @@
color = "#C7FFFF"
/datum/reagent/silicate/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/structure/window))
var/obj/structure/window/W = O
W.apply_silicate(volume)
@@ -593,9 +606,11 @@
color = "#F2F3F4"
/datum/reagent/luminol/touch_obj(var/obj/O)
+ ..()
O.reveal_blood()
/datum/reagent/luminol/touch_mob(var/mob/living/L)
+ ..()
L.reveal_blood()
/datum/reagent/nutriment/biomass
diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm
index 23fc080e8c..91a7ed12b4 100644
--- a/code/modules/reagents/reagents/toxins.dm
+++ b/code/modules/reagents/reagents/toxins.dm
@@ -96,6 +96,7 @@
var/fire_mult = 30
/datum/reagent/toxin/hydrophoron/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / fire_mult)
@@ -107,6 +108,7 @@
/datum/reagent/toxin/hydrophoron/touch_turf(var/turf/simulated/T)
if(!istype(T))
return
+ ..()
T.assume_gas("phoron", CEILING(volume/2, 1), T20C)
for(var/turf/simulated/floor/target_tile in range(0,T))
target_tile.assume_gas("phoron", volume/2, 400+T0C)
@@ -148,6 +150,7 @@
skin_danger = 1
/datum/reagent/toxin/phoron/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 5)
@@ -169,6 +172,7 @@
..()
/datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T, var/amount)
+ ..()
if(!istype(T))
return
T.assume_gas("volatile_fuel", amount, T20C)
@@ -390,6 +394,7 @@
color = "#e67819"
/datum/reagent/toxin/fertilizer/tannin/touch_obj(var/obj/O, var/volume)
+ ..()
if(istype(O, /obj/item/stack/hairlesshide))
var/obj/item/stack/hairlesshide/HH = O
HH.rapidcure(round(volume))
@@ -405,6 +410,7 @@
strength = 4
/datum/reagent/toxin/plantbgone/touch_turf(var/turf/T)
+ ..()
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
if(locate(/obj/effect/overlay/wallrot) in W)
@@ -413,6 +419,7 @@
W.visible_message("The fungi are completely dissolved by the solution!")
/datum/reagent/toxin/plantbgone/touch_obj(var/obj/O, var/volume)
+ ..()
if(istype(O, /obj/effect/plant))
qdel(O)
else if(istype(O, /obj/effect/alien/weeds/))
diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
index a3ec12a953..532503b7e0 100644
--- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
@@ -625,6 +625,40 @@
else
return 1
+//scree:Avida
+/obj/item/clothing/under/skirt/outfit/fluff/avida
+ name = "purple dress"
+ desc = "A clingy purple dress with red lacework, with a hole at the back for a tail."
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "avidadress"
+ item_state = "avidadress"
+ item_icons = list(
+ slot_l_hand_str = 'icons/vore/custom_clothes_left_hand_vr.dmi',
+ slot_r_hand_str = 'icons/vore/custom_clothes_right_hand_vr.dmi',
+ slot_w_uniform_str = 'icons/vore/custom_onmob_vr.dmi'
+ )
+
+//scree:Avida
+/obj/item/clothing/head/fluff/avida
+ name = "purple witch hat"
+ desc = "A pointy purple hat with a wide brim, with a red hatband. It appears to have ear-holes in it."
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "avidahat"
+ item_state = "avidahat"
+ item_icons = list(
+ slot_l_hand_str = 'icons/vore/custom_clothes_left_hand_vr.dmi',
+ slot_r_hand_str = 'icons/vore/custom_clothes_right_hand_vr.dmi',
+ slot_head_str = 'icons/vore/custom_onmob_32x48_vr.dmi'
+ )
+
+/obj/item/clothing/head/fluff/avida/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+ if(..())
+ if(H.ear_style.name == "Bnnuy Ears"||H.ear_style.name == "Bnnuy Ears 2") //check if wearer's ear sprite is compatible with trimmed icon
+ item_state = initial(src.item_state)
+ else //if not, just use a generic icon
+ item_state = "avidahatnoears"
+ return TRUE
+
//natje:Pumila
/obj/item/clothing/under/fluff/aluranevines
name = "Pumila's vines"
@@ -645,27 +679,6 @@
else
return 1
-/obj/item/clothing/under/fluff/screesuit
- name = "Scree's feathers"
- desc = "A mop of fluffy blue feathers, the honkmother only knows what kind of bird they originally came from."
-
- icon = 'icons/vore/custom_clothes_vr.dmi'
- icon_state = "screesuit"
-
- icon_override = 'icons/vore/custom_clothes_vr.dmi'
- item_state = "screesuit_mob"
-
-/obj/item/clothing/under/fluff/screesuit/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
- if(..())
- if(H.ckey != "scree")
- to_chat(H, "Are you just going to tape them on or what? This isn't gonna work.")
- return 0
- else
- return 1
-
-/obj/item/clothing/under/fluff/screesuit/digest_act(var/atom/movable/item_storage = null)
- return FALSE
-
//HOS Hardsuit
/obj/item/clothing/suit/space/void/security/fluff/hos // ToDo: Rig version.
name = "\improper prototype voidsuit"
@@ -2420,4 +2433,13 @@ Departamental Swimsuits, for general use
H.update_inv_wear_suit()
else
RemoveHood_evelyn()
+
+//Uncle_Fruit_VEVO - Bradley Khatibi
+/obj/item/clothing/shoes/fluff/airjordans
+ name = "A pair of Air Jordan 1 Mid 'Black Gym Red's"
+ desc = "Appearing in a classic Jordan Brand colorway, the Air Jordan 1 Mid 'Black Gym Red' released in May 2021. Built with leather, the shoe's upper sports a white base, contrasted by black on the overlays and highlighted by Gym Red on the padded collar, 'Wings' logo and Swoosh branding. A breathable nylon tongue and perforated toe box support the fit, while underfoot, a standard rubber cupsole with Air in the heel anchors the build."
+ icon_state = "airjordans"
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_override = 'icons/vore/custom_onmob_vr.dmi'
+
End CHOMP Removal*/
diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm
index f9ac6ef4f5..e725254f0b 100644
--- a/code/modules/xenoarcheaology/anomaly_container.dm
+++ b/code/modules/xenoarcheaology/anomaly_container.dm
@@ -14,6 +14,15 @@
if(A)
contain(A)
+ else
+ for(var/obj/Ob in loc)
+ if(can_contain(Ob))
+ contain(Ob)
+ break
+
+/obj/structure/anomaly_container/proc/can_contain(var/obj/O)
+ return O.is_anomalous()
+
/obj/structure/anomaly_container/attack_hand(var/mob/user)
release()
@@ -37,7 +46,11 @@
underlays.Cut()
desc = initial(desc)
-/obj/machinery/artifact/MouseDrop(var/obj/structure/anomaly_container/over_object)
- if(istype(over_object) && Adjacent(over_object) && CanMouseDrop(over_object, usr))
- Bumped(usr)
- over_object.contain(src)
\ No newline at end of file
+/atom/MouseDrop(var/obj/structure/anomaly_container/over_object)
+ . = ..()
+
+ if(istype(over_object))
+ if(!QDELETED(src) && istype(loc, /turf) && is_anomalous() && Adjacent(over_object) && CanMouseDrop(over_object, usr))
+ Bumped(usr)
+ over_object.contain(src)
+
diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm
index e723561a73..7a2d73474a 100644
--- a/code/modules/xenoarcheaology/artifacts/artifact.dm
+++ b/code/modules/xenoarcheaology/artifacts/artifact.dm
@@ -5,42 +5,25 @@
icon_state = "ano00"
var/icon_num = 0
density = TRUE
- var/datum/artifact_effect/my_effect
- var/datum/artifact_effect/secondary_effect
- var/being_used = 0
-
- var/predefined_effects = FALSE
-
- var/predefined_primary
- var/predefined_secondary
var/predefined_icon_num
- var/predefined_triggers = FALSE
+ var/datum/component/artifact_master/artifact_master = /datum/component/artifact_master
- var/predefined_trig_primary
- var/predefined_trig_secondary
+ var/being_used = 0
/obj/machinery/artifact/New()
..()
- if(predefined_effects && predefined_primary)
- my_effect = new predefined_primary(src)
+ if(ispath(artifact_master))
+ AddComponent(artifact_master)
- if(predefined_secondary)
- secondary_effect = new predefined_secondary(src)
- if(prob(75))
- secondary_effect.ToggleActivate(0)
+ artifact_master = GetComponent(artifact_master)
- else
- var/effecttype = pick(subtypesof(/datum/artifact_effect))
- my_effect = new effecttype(src)
+ if(!istype(artifact_master))
+ return
- if(prob(75))
- effecttype = pick(subtypesof(/datum/artifact_effect))
- secondary_effect = new effecttype(src)
- if(prob(75))
- secondary_effect.ToggleActivate(0)
+ var/datum/artifact_effect/my_effect = artifact_master.get_primary()
if(!isnull(predefined_icon_num))
icon_num = predefined_icon_num
@@ -77,299 +60,10 @@
if(prob(60))
my_effect.trigger = pick(TRIGGER_TOUCH, TRIGGER_HEAT, TRIGGER_COLD, TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO)
- if(predefined_triggers)
- if(predefined_trig_primary && my_effect)
- my_effect.trigger = predefined_trig_primary
-
- if(predefined_trig_secondary && secondary_effect)
- secondary_effect.trigger = predefined_trig_secondary
-
-/obj/machinery/artifact/proc/choose_effect()
- var/effect_type = tgui_input_list(usr, "What type do you want?", "Effect Type", subtypesof(/datum/artifact_effect))
- if(effect_type)
- my_effect = new effect_type(src)
- if(tgui_alert(usr, "Do you want a secondary effect?", "Second Effect", list("No", "Yes")) == "Yes")
- var/second_effect_type = tgui_input_list(usr, "What type do you want as well?", "Second Effect Type", subtypesof(/datum/artifact_effect) - effect_type)
- secondary_effect = new second_effect_type(src)
- else
- secondary_effect = null
-
-
-/obj/machinery/artifact/process()
- var/turf/L = loc
- if(!istype(L)) // We're inside a container or on null turf, either way stop processing effects
- return
-
- if(my_effect)
- my_effect.process()
- if(secondary_effect)
- secondary_effect.process()
-
- if(pulledby)
- Bumped(pulledby)
-
- //if either of our effects rely on environmental factors, work that out
- var/trigger_cold = 0
- var/trigger_hot = 0
- var/trigger_phoron = 0
- var/trigger_oxy = 0
- var/trigger_co2 = 0
- var/trigger_nitro = 0
- if( (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) || (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) )
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/env = T.return_air()
- if(env)
- if(env.temperature < 225)
- trigger_cold = 1
- else if(env.temperature > 375)
- trigger_hot = 1
-
- if(env.gas["phoron"] >= 10)
- trigger_phoron = 1
- if(env.gas["oxygen"] >= 10)
- trigger_oxy = 1
- if(env.gas["carbon_dioxide"] >= 10)
- trigger_co2 = 1
- if(env.gas["nitrogen"] >= 10)
- trigger_nitro = 1
-
- //COLD ACTIVATION
- if(trigger_cold)
- if(my_effect.trigger == TRIGGER_COLD && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_COLD && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //HEAT ACTIVATION
- if(trigger_hot)
- if(my_effect.trigger == TRIGGER_HEAT && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_HEAT && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //PHORON GAS ACTIVATION
- if(trigger_phoron)
- if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //OXYGEN GAS ACTIVATION
- if(trigger_oxy)
- if(my_effect.trigger == TRIGGER_OXY && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_OXY && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //CO2 GAS ACTIVATION
- if(trigger_co2)
- if(my_effect.trigger == TRIGGER_CO2 && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_CO2 && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //NITROGEN GAS ACTIVATION
- if(trigger_nitro)
- if(my_effect.trigger == TRIGGER_NITRO && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_NITRO && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/attack_hand(var/mob/user as mob)
- if (get_dist(user, src) > 1)
- to_chat(user, "You can't reach [src] from here.")
- return
- if(ishuman(user) && user:gloves)
- to_chat(user, "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
- return
-
- src.add_fingerprint(user)
-
- if(my_effect.trigger == TRIGGER_TOUCH)
- to_chat(user, "You touch [src].")
- my_effect.ToggleActivate()
- else
- to_chat(user, "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
-
- if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH)
- secondary_effect.ToggleActivate(0)
-
- if (my_effect.effect == EFFECT_TOUCH)
- my_effect.DoEffectTouch(user)
-
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated)
- secondary_effect.DoEffectTouch(user)
-
-/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
-
- if (istype(W, /obj/item/weapon/reagent_containers/))
- if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1))
- if(my_effect.trigger == TRIGGER_WATER)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1))
- if(my_effect.trigger == TRIGGER_ACID)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1))
- if(my_effect.trigger == TRIGGER_VOLATILE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_VOLATILE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amatoxin", 1) || W.reagents.has_reagent("neurotoxin", 1))
- if(my_effect.trigger == TRIGGER_TOXIN)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOXIN && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\
- istype(W,/obj/item/weapon/melee/energy) ||\
- istype(W,/obj/item/weapon/melee/cultblade) ||\
- istype(W,/obj/item/weapon/card/emag) ||\
- istype(W,/obj/item/device/multitool))
- if (my_effect.trigger == TRIGGER_ENERGY)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25))
- secondary_effect.ToggleActivate(0)
-
- else if (istype(W,/obj/item/weapon/flame) && W:lit ||\
- istype(W,/obj/item/weapon/weldingtool) && W:welding)
- if(my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && prob(25))
- secondary_effect.ToggleActivate(0)
- else
- ..()
- if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/Bumped(M as mob|obj)
- ..()
- if(istype(M,/obj))
- if(M:throwforce >= 10)
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves))
- var/warn = 0
-
- if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
- my_effect.ToggleActivate()
- warn = 1
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25))
- secondary_effect.ToggleActivate(0)
- warn = 1
-
- if (my_effect.effect == EFFECT_TOUCH && prob(50))
- my_effect.DoEffectTouch(M)
- warn = 1
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50))
- secondary_effect.DoEffectTouch(M)
- warn = 1
-
- if(warn)
- to_chat(M, "You accidentally touch \the [src].")
+/obj/machinery/artifact/update_icon()
..()
-/obj/machinery/artifact/Bump(var/atom/bumped)
- if(istype(bumped,/obj))
- if(bumped:throwforce >= 10)
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(ishuman(bumped) && GetAnomalySusceptibility(bumped) >= 0.5)
- var/warn = 0
-
- if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
- my_effect.ToggleActivate()
- warn = 1
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25))
- secondary_effect.ToggleActivate(0)
- warn = 1
-
- if (my_effect.effect == EFFECT_TOUCH && prob(50))
- my_effect.DoEffectTouch(bumped)
- warn = 1
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50))
- secondary_effect.DoEffectTouch(bumped)
- warn = 1
-
- if(warn)
- to_chat(bumped, "You accidentally touch \the [src] as it hits you.")
-
- ..()
-
-/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P)
- if(istype(P,/obj/item/projectile/bullet))
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
-
- else if(istype(P,/obj/item/projectile/beam) ||\
- istype(P,/obj/item/projectile/ion) ||\
- istype(P,/obj/item/projectile/energy))
- if(my_effect.trigger == TRIGGER_ENERGY)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25))
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/ex_act(severity)
- switch(severity)
- if(1.0) qdel(src)
- if(2.0)
- if (prob(50))
- qdel(src)
- else
- if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
- secondary_effect.ToggleActivate(0)
- if(3.0)
- if (my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
- secondary_effect.ToggleActivate(0)
- return
-
-/obj/machinery/artifact/Moved()
- . = ..()
- if(my_effect)
- my_effect.UpdateMove()
- if(secondary_effect)
- secondary_effect.UpdateMove()
+ if(LAZYLEN(artifact_master.get_active_effects()))
+ icon_state = "ano[icon_num]1"
+ else
+ icon_state = "ano[icon_num]0"
diff --git a/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm b/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
index edec0dd052..bc0fa92645 100644
--- a/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
+++ b/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
@@ -1,15 +1,3 @@
/obj/machinery/artifact/predefined
name = "alien artifact"
- desc = "A large alien device."
-
- predefined_effects = TRUE
-
- predefined_primary = null
- predefined_secondary = null
-
- predefined_icon_num = null
-
- predefined_triggers = FALSE
-
- predefined_trig_primary = null
- predefined_trig_secondary = null
+ desc = "A large alien device."
\ No newline at end of file
diff --git a/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm b/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
index 6a81c02b8b..c4141ff192 100644
--- a/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
+++ b/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
@@ -2,14 +2,12 @@
name = "alien artifact"
desc = "A large alien device."
- predefined_effects = TRUE
-
- predefined_primary = /datum/artifact_effect/animate_anomaly
- predefined_secondary = /datum/artifact_effect/vampire
+ artifact_master = /datum/component/artifact_master/hungry_statue
predefined_icon_num = 14
- predefined_triggers = TRUE
-
- predefined_trig_primary = TRIGGER_OXY
- predefined_trig_secondary = TRIGGER_OXY
+/datum/component/artifact_master/hungry_statue
+ make_effects = list(
+ /datum/artifact_effect/animate_anomaly,
+ /datum/artifact_effect/vampire
+ )
diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm
index 7baa254643..b260f0b62a 100644
--- a/code/modules/xenoarcheaology/boulder.dm
+++ b/code/modules/xenoarcheaology/boulder.dm
@@ -75,8 +75,8 @@
var/obj/O = new spawn_type(get_turf(src))
if(istype(O, /obj/machinery/artifact))
var/obj/machinery/artifact/X = O
- if(X.my_effect)
- X.my_effect.artifact_id = artifact_find.artifact_id
+ if(X.artifact_master)
+ X.artifact_master.artifact_id = artifact_find.artifact_id
O.anchored = FALSE // Anchored finds are lame.
src.visible_message("\The [src] suddenly crumbles away.")
else
diff --git a/code/modules/xenoarcheaology/effect.dm b/code/modules/xenoarcheaology/effect.dm
index 8b9dd625c1..145bd3e258 100644
--- a/code/modules/xenoarcheaology/effect.dm
+++ b/code/modules/xenoarcheaology/effect.dm
@@ -3,19 +3,47 @@
var/effect = EFFECT_TOUCH
var/effectrange = 4
var/trigger = TRIGGER_TOUCH
- var/atom/holder
+ var/datum/component/artifact_master/master
var/activated = 0
- var/chargelevel = 0
+ var/chargelevel = 1
var/chargelevelmax = 10
var/artifact_id = ""
var/effect_type = 0
-/datum/artifact_effect/New(var/atom/location)
+ var/req_type = /atom/movable
+
+ var/image/active_effect
+ var/effect_icon = 'icons/effects/effects.dmi'
+ var/effect_state = "sparkles"
+ var/effect_color = "#ffffff"
+
+ // The last time the effect was toggled.
+ var/last_activation = 0
+
+/datum/artifact_effect/Destroy()
+ if(master)
+ master = null
..()
- holder = location
+
+/datum/artifact_effect/proc/get_master_holder() // Return the effectmaster's holder, if it is set to an effectmaster. Otherwise, master is the target object.
+ if(istype(master))
+ return master.holder
+ else
+ return master
+
+/datum/artifact_effect/New(var/datum/component/artifact_master/newmaster)
+ ..()
+
+ master = newmaster
effect = rand(0, MAX_EFFECT)
trigger = rand(0, MAX_TRIGGER)
+ if(effect_icon && effect_state)
+ if(effect_state == "sparkles")
+ effect_state = "sparkles_[rand(1,4)]"
+ active_effect = image(effect_icon, effect_state)
+ active_effect.color = effect_color
+
//this will be replaced by the excavation code later, but it's here just in case
artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
@@ -36,21 +64,32 @@
/datum/artifact_effect/proc/ToggleActivate(var/reveal_toggle = 1)
//so that other stuff happens first
- spawn(0)
+ set waitfor = FALSE
+
+ var/atom/target = get_master_holder()
+
+ if(world.time - last_activation > 1 SECOND)
+ last_activation = world.time
if(activated)
activated = 0
else
activated = 1
- if(reveal_toggle && holder)
- if(istype(holder, /obj/machinery/artifact))
- var/obj/machinery/artifact/A = holder
- A.icon_state = "ano[A.icon_num][activated]"
+ if(reveal_toggle && target)
+ if(!isliving(target))
+ target.update_icon()
var/display_msg
if(activated)
display_msg = pick("momentarily glows brightly!","distorts slightly for a moment!","flickers slightly!","vibrates!","shimmers slightly for a moment!")
else
display_msg = pick("grows dull!","fades in intensity!","suddenly becomes very still!","suddenly becomes very quiet!")
- var/atom/toplevelholder = holder
+
+ if(active_effect)
+ if(activated)
+ target.underlays.Add(active_effect)
+ else
+ target.underlays.Remove(active_effect)
+
+ var/atom/toplevelholder = target
while(!istype(toplevelholder.loc, /turf))
toplevelholder = toplevelholder.loc
toplevelholder.visible_message("[bicon(toplevelholder)] [toplevelholder] [display_msg]")
diff --git a/code/modules/xenoarcheaology/effect_master.dm b/code/modules/xenoarcheaology/effect_master.dm
new file mode 100644
index 0000000000..f654724b32
--- /dev/null
+++ b/code/modules/xenoarcheaology/effect_master.dm
@@ -0,0 +1,421 @@
+
+/*
+ * Here there be the base component for artifacts.
+ */
+
+/atom/proc/is_anomalous()
+ return (GetComponent(/datum/component/artifact_master))
+
+/atom/proc/become_anomalous()
+ if(!is_anomalous())
+ AddComponent(/datum/component/artifact_master)
+ if(istype(src, /obj/item))
+ var/obj/item/I = src
+ LAZYINITLIST(I.origin_tech)
+ if(prob(50))
+ I.origin_tech[TECH_PRECURSOR] += 1
+ else
+ I.origin_tech[TECH_ARCANE] += 1
+ var/rand_tech = pick(\
+ TECH_MATERIAL,\
+ TECH_ENGINEERING,\
+ TECH_PHORON,\
+ TECH_POWER,\
+ TECH_BLUESPACE,\
+ TECH_BIO,\
+ TECH_COMBAT,\
+ TECH_MAGNET,\
+ TECH_DATA,\
+ TECH_ILLEGAL\
+ )
+ LAZYSET(I.origin_tech, rand_tech, rand(4,7))
+
+/datum/component/artifact_master
+ var/atom/holder
+ var/list/my_effects
+
+ dupe_type = /datum/component/artifact_master
+
+ var/effect_generation_chance = 100
+
+ var/list/make_effects
+
+ var/artifact_id
+
+/datum/component/artifact_master/New()
+ . = ..()
+ holder = parent
+
+ if(!holder)
+ qdel(src)
+ return
+
+ my_effects = list()
+
+ START_PROCESSING(SSobj, src)
+
+ do_setup()
+ return
+
+/*
+ * Component System Registry.
+ * Here be dragons.
+ */
+
+/datum/component/artifact_master/proc/DoRegistry()
+//Melee Hit
+ RegisterSignal(holder, COMSIG_PARENT_ATTACKBY, /datum/component/artifact_master/proc/on_attackby, override = FALSE)
+//Explosions
+ RegisterSignal(holder, COMSIG_ATOM_EX_ACT, /datum/component/artifact_master/proc/on_exact, override = FALSE)
+//Bullets
+ RegisterSignal(holder, COMSIG_ATOM_BULLET_ACT, /datum/component/artifact_master/proc/on_bullet, override = FALSE)
+
+//Attackhand
+ RegisterSignal(holder, COMSIG_ATOM_ATTACK_HAND, /datum/component/artifact_master/proc/on_attack_hand, override = FALSE)
+
+//Bumped / Bumping
+ RegisterSignal(holder, COMSIG_MOVABLE_BUMP, /datum/component/artifact_master/proc/on_bump, override = FALSE)
+ RegisterSignal(holder, COMSIG_ATOM_BUMPED, /datum/component/artifact_master/proc/on_bumped, override = FALSE)
+
+//Moved
+ RegisterSignal(holder, COMSIG_MOVABLE_MOVED, /datum/component/artifact_master/proc/on_moved, override = FALSE)
+
+//Splashed with a reagent.
+ RegisterSignal(holder, COMSIG_REAGENTS_TOUCH, /datum/component/artifact_master/proc/on_reagent, override = FALSE)
+
+/*
+ *
+ */
+
+/datum/component/artifact_master/proc/get_active_effects()
+ var/list/active_effects = list()
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(my_effect.activated)
+ active_effects |= my_effect
+
+ return active_effects
+
+/datum/component/artifact_master/proc/add_effect()
+ var/effect_type = input(usr, "What type do you want?", "Effect Type") as null|anything in subtypesof(/datum/artifact_effect)
+ if(effect_type)
+ var/datum/artifact_effect/my_effect = new effect_type(src)
+ if(istype(holder, my_effect.req_type))
+ my_effects += my_effect
+
+ else
+ to_chat(usr, "This effect can not be applied to this atom type.")
+ qdel(my_effect)
+
+/datum/component/artifact_master/proc/remove_effect()
+ var/to_remove_effect = input(usr, "What effect do you want to remove?", "Remove Effect") as null|anything in my_effects
+
+ if(to_remove_effect)
+ var/datum/artifact_effect/AE = to_remove_effect
+ my_effects.Remove(to_remove_effect)
+ qdel(AE)
+
+/datum/component/artifact_master/Destroy()
+ holder = null
+ for(var/datum/artifact_effect/AE in my_effects)
+ AE.master = null
+ qdel(AE)
+
+ STOP_PROCESSING(SSobj,src)
+
+ . = ..()
+
+/datum/component/artifact_master/proc/do_setup()
+ if(LAZYLEN(make_effects))
+ for(var/path in make_effects)
+ var/datum/artifact_effect/new_effect = new path(src)
+ if(istype(holder, new_effect.req_type))
+ my_effects += new_effect
+
+ else
+ generate_effects()
+
+ DoRegistry()
+
+/datum/component/artifact_master/proc/generate_effects()
+ while(effect_generation_chance > 0)
+ var/chosen_path = pick(subtypesof(/datum/artifact_effect))
+ if(effect_generation_chance >= 100) // If we're above 100 percent, just cut a flat amount and add an effect.
+ var/datum/artifact_effect/AE = new chosen_path(src)
+ if(istype(holder, AE.req_type))
+ my_effects += AE
+ effect_generation_chance -= 30
+ else
+ AE.master = src
+ qdel(AE)
+ continue
+
+ effect_generation_chance /= 2
+
+ if(prob(effect_generation_chance)) // Otherwise, add effects as normal, with decreasing probability.
+ my_effects += new chosen_path(src)
+
+ effect_generation_chance = round(effect_generation_chance)
+
+/datum/component/artifact_master/proc/get_holder() // Returns the holder.
+ return holder
+
+/datum/component/artifact_master/proc/get_primary()
+ if(LAZYLEN(my_effects))
+ return my_effects[1]
+ return FALSE
+
+/*
+ * Trigger code.
+ */
+
+/datum/component/artifact_master/proc/on_exact()
+ var/severity = args[2]
+ var/triggered = FALSE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ switch(severity)
+ if(1.0)
+ if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT || my_effect.trigger == TRIGGER_ENERGY)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+ if(2.0)
+ if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+ if(3.0)
+ if (my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+
+ if(triggered)
+ return COMPONENT_IGNORE_EXPLOSION
+
+ return
+
+/datum/component/artifact_master/proc/on_bullet()
+ var/obj/item/projectile/P = args[2]
+ var/triggered = TRUE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(istype(P,/obj/item/projectile/bullet))
+ if(my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+
+ else if(istype(P,/obj/item/projectile/beam) ||\
+ istype(P,/obj/item/projectile/ion) ||\
+ istype(P,/obj/item/projectile/energy))
+ if(my_effect.trigger == TRIGGER_ENERGY)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+
+ if(triggered)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+ return
+
+/datum/component/artifact_master/proc/on_bump()
+ var/atom/bumped = args[2]
+ var/warn = FALSE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(istype(bumped,/obj))
+ if(bumped:throwforce >= 10)
+ if(my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+
+ else if(ishuman(bumped) && GetAnomalySusceptibility(bumped) >= 0.5)
+ if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
+ my_effect.ToggleActivate()
+ warn = 1
+
+ if (my_effect.effect == EFFECT_TOUCH && prob(50))
+ my_effect.DoEffectTouch(bumped)
+ warn = 1
+
+ if(warn && isliving(bumped))
+ to_chat(bumped, "You accidentally touch \the [holder] as it hits you.")
+
+/datum/component/artifact_master/proc/on_bumped()
+ var/atom/movable/M = args[2]
+ var/warn = FALSE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(istype(M,/obj))
+ if(M:throwforce >= 10)
+ if(my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+
+ else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves))
+ if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
+ my_effect.ToggleActivate()
+ warn = 1
+
+ if (my_effect.effect == EFFECT_TOUCH && prob(50))
+ my_effect.DoEffectTouch(M)
+ warn = 1
+
+ if(warn && isliving(M))
+ to_chat(M, "You accidentally touch \the [holder].")
+
+/datum/component/artifact_master/proc/on_attack_hand()
+ var/mob/living/user = args[2]
+ if(!istype(user))
+ return
+
+ if (get_dist(user, holder) > 1)
+ to_chat(user, "You can't reach [holder] from here.")
+ return
+ if(ishuman(user) && user:gloves)
+ to_chat(user, "You touch [holder] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
+ return
+
+ var/triggered = FALSE
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+
+ if(my_effect.trigger == TRIGGER_TOUCH)
+ triggered = TRUE
+ my_effect.ToggleActivate()
+
+ if (my_effect.effect == EFFECT_TOUCH)
+ triggered = TRUE
+ my_effect.DoEffectTouch(user)
+
+ if(triggered)
+ to_chat(user, "You touch [holder].")
+
+ else
+ to_chat(user, "You touch [holder], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
+
+
+/datum/component/artifact_master/proc/on_attackby()
+ var/obj/item/weapon/W = args[2]
+ for(var/datum/artifact_effect/my_effect in my_effects)
+
+ if (istype(W, /obj/item/weapon/reagent_containers))
+ if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1))
+ if(my_effect.trigger == TRIGGER_WATER)
+ my_effect.ToggleActivate()
+ else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1))
+ if(my_effect.trigger == TRIGGER_ACID)
+ my_effect.ToggleActivate()
+ else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1))
+ if(my_effect.trigger == TRIGGER_VOLATILE)
+ my_effect.ToggleActivate()
+ else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amatoxin", 1) || W.reagents.has_reagent("neurotoxin", 1))
+ if(my_effect.trigger == TRIGGER_TOXIN)
+ my_effect.ToggleActivate()
+ else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\
+ istype(W,/obj/item/weapon/melee/energy) ||\
+ istype(W,/obj/item/weapon/melee/cultblade) ||\
+ istype(W,/obj/item/weapon/card/emag) ||\
+ istype(W,/obj/item/device/multitool))
+ if (my_effect.trigger == TRIGGER_ENERGY)
+ my_effect.ToggleActivate()
+
+ else if (istype(W,/obj/item/weapon/flame) && W:lit ||\
+ istype(W,/obj/item/weapon/weldingtool) && W:welding)
+ if(my_effect.trigger == TRIGGER_HEAT)
+ my_effect.ToggleActivate()
+ else
+ if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10)
+ my_effect.ToggleActivate()
+
+/datum/component/artifact_master/proc/on_reagent()
+ var/datum/reagent/Touching = args[2]
+
+ var/list/water = list("hydrogen", "water")
+ var/list/acid = list("sacid", "pacid", "diethylamine")
+ var/list/volatile = list("phoron","thermite")
+ var/list/toxic = list("toxin","cyanide","amatoxin","neurotoxin")
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(Touching.id in water)
+ if(my_effect.trigger == TRIGGER_WATER)
+ my_effect.ToggleActivate()
+ else if(Touching.id in acid)
+ if(my_effect.trigger == TRIGGER_ACID)
+ my_effect.ToggleActivate()
+ else if(Touching.id in volatile)
+ if(my_effect.trigger == TRIGGER_VOLATILE)
+ my_effect.ToggleActivate()
+ else if(Touching.id in toxic)
+ if(my_effect.trigger == TRIGGER_TOXIN)
+ my_effect.ToggleActivate()
+
+/datum/component/artifact_master/proc/on_moved()
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(my_effect)
+ my_effect.UpdateMove()
+
+/datum/component/artifact_master/process()
+ if(!holder) // Some instances can be created and rapidly lose their holder, if they are destroyed rapidly on creation. IE, during excavation.
+ STOP_PROCESSING(SSobj, src)
+ if(!QDELETED(src))
+ qdel(src)
+ return
+
+ var/turf/L = holder.loc
+ if(!istype(L) && !isliving(L)) // We're inside a non-mob container or on null turf, either way stop processing effects
+ return
+
+ if(istype(holder, /atom/movable))
+ var/atom/movable/HA = holder
+ if(HA.pulledby)
+ on_bumped(holder, HA.pulledby)
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(my_effect)
+ my_effect.UpdateMove()
+
+ //if any of our effects rely on environmental factors, work that out
+ var/trigger_cold = 0
+ var/trigger_hot = 0
+ var/trigger_phoron = 0
+ var/trigger_oxy = 0
+ var/trigger_co2 = 0
+ var/trigger_nitro = 0
+
+ var/turf/T = get_turf(holder)
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ if(env.temperature < 225)
+ trigger_cold = 1
+ else if(env.temperature > 375)
+ trigger_hot = 1
+
+ if(env.gas["phoron"] >= 10)
+ trigger_phoron = 1
+ if(env.gas["oxygen"] >= 10)
+ trigger_oxy = 1
+ if(env.gas["carbon_dioxide"] >= 10)
+ trigger_co2 = 1
+ if(env.gas["nitrogen"] >= 10)
+ trigger_nitro = 1
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ my_effect.artifact_id = artifact_id
+
+ my_effect.process()
+
+ //COLD ACTIVATION
+ if(my_effect.trigger == TRIGGER_COLD && (trigger_cold ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //HEAT ACTIVATION
+ if(my_effect.trigger == TRIGGER_HEAT && (trigger_hot ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //PHORON GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_PHORON && (trigger_phoron ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //OXYGEN GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_OXY && (trigger_oxy ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //CO2 GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_CO2 && (trigger_co2 ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //NITROGEN GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_NITRO && (trigger_nitro ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
diff --git a/code/modules/xenoarcheaology/effects/animate_anomaly.dm b/code/modules/xenoarcheaology/effects/animate_anomaly.dm
index c0c17e4aaf..7cf3e408e9 100644
--- a/code/modules/xenoarcheaology/effects/animate_anomaly.dm
+++ b/code/modules/xenoarcheaology/effects/animate_anomaly.dm
@@ -4,6 +4,9 @@
effect_type = EFFECT_PSIONIC
var/mob/living/target = null
+ effect_state = "pulsing"
+ effect_color = "#00c3ff"
+
/datum/artifact_effect/animate_anomaly/ToggleActivate(var/reveal_toggle = 1)
..()
find_target()
@@ -13,21 +16,24 @@
effectrange = max(3, effectrange)
/datum/artifact_effect/animate_anomaly/proc/find_target()
- if(!target || target.z != holder.z || get_dist(target, holder) > effectrange)
+ var/atom/masterholder = get_master_holder()
+
+ if(!target || target.z != masterholder.z || get_dist(target, masterholder) > effectrange)
var/mob/living/ClosestMob = null
- for(var/mob/living/L in range(effectrange, holder))
+ for(var/mob/living/L in range(effectrange, get_turf(masterholder)))
if(!L.mind)
continue
if(!ClosestMob)
ClosestMob = L
continue
if(!L.stat)
- if(get_dist(holder, L) < get_dist(holder, ClosestMob))
+ if(get_dist(masterholder, L) < get_dist(masterholder, ClosestMob))
ClosestMob = L
target = ClosestMob
/datum/artifact_effect/animate_anomaly/DoEffectTouch(var/mob/living/user)
+ var/atom/holder = get_master_holder()
var/obj/O = holder
var/turf/T = get_step_away(O, user)
@@ -36,25 +42,23 @@
O.visible_message("\The [holder] lurches away from [user]")
/datum/artifact_effect/animate_anomaly/DoEffectAura()
- var/obj/O = holder
- if(!target || target.z != O.z || get_dist(target, O) > effectrange)
- target = null
- find_target()
- var/turf/T = get_step_to(O, target)
+ var/obj/O = get_master_holder()
+ find_target()
- if(target && istype(T) && istype(O.loc, /turf))
- if(get_dist(O, T) > 1)
- O.Move(T)
- O.visible_message("\The [holder] lurches toward [target]")
+ if(!target || !istype(O))
+ return
+
+ O.dir = get_dir(O, target)
+
+ if(!target || !istype(O))
+ return
+
+ O.dir = get_dir(O, target)
+
+ if(istype(O.loc, /turf))
+ if(get_dist(O.loc, target.loc) > 1)
+ O.Move(get_step_to(O, target))
+ O.visible_message("\The [O] lurches toward [target]")
/datum/artifact_effect/animate_anomaly/DoEffectPulse()
- var/obj/O = holder
- if(!target || target.z != O.z || get_dist(target, O) > effectrange)
- target = null
- find_target()
- var/turf/T = get_step_to(O, target)
-
- if(target && istype(T) && istype(O.loc, /turf))
- if(get_dist(O, T) > 1)
- O.Move(T)
- O.visible_message("\The [holder] lurches toward [target]")
+ DoEffectAura()
diff --git a/code/modules/xenoarcheaology/effects/badfeeling.dm b/code/modules/xenoarcheaology/effects/badfeeling.dm
index a0aa7dc775..2a7e480e18 100644
--- a/code/modules/xenoarcheaology/effects/badfeeling.dm
+++ b/code/modules/xenoarcheaology/effects/badfeeling.dm
@@ -25,6 +25,9 @@
"OH GOD!",
"HELP ME!")
+ effect_state = "summoning"
+ effect_color = "#643232"
+
/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user)
if(user)
if (istype(user, /mob/living/carbon/human))
@@ -39,6 +42,7 @@
H.dizziness += rand(3,5)
/datum/artifact_effect/badfeeling/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -53,6 +57,7 @@
return 1
/datum/artifact_effect/badfeeling/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/berserk.dm b/code/modules/xenoarcheaology/effects/berserk.dm
index a221c9104c..4965747909 100644
--- a/code/modules/xenoarcheaology/effects/berserk.dm
+++ b/code/modules/xenoarcheaology/effects/berserk.dm
@@ -2,6 +2,9 @@
name = "berserk"
effect_type = EFFECT_PSIONIC
+ effect_state = "summoning"
+ effect_color = "#5f0000"
+
/datum/artifact_effect/berserk/proc/apply_berserk(var/mob/living/L)
if(!istype(L))
return FALSE
@@ -28,6 +31,7 @@
return TRUE
/datum/artifact_effect/berserk/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
@@ -36,6 +40,7 @@
return TRUE
/datum/artifact_effect/berserk/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/cannibal.dm b/code/modules/xenoarcheaology/effects/cannibal.dm
index 04a0b5a9e8..ad584ccc7c 100644
--- a/code/modules/xenoarcheaology/effects/cannibal.dm
+++ b/code/modules/xenoarcheaology/effects/cannibal.dm
@@ -25,6 +25,9 @@
"Butcher them!",
"Feast!")
+ effect_state = "summoning"
+ effect_color = "#c50303"
+
/datum/artifact_effect/cannibalfeeling/DoEffectTouch(var/mob/user)
if(user)
if (istype(user, /mob/living/carbon/human))
@@ -41,6 +44,7 @@
H.nutrition = H.nutrition / 1.5
/datum/artifact_effect/cannibalfeeling/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -57,6 +61,7 @@
return 1
/datum/artifact_effect/cannibalfeeling/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/cellcharge.dm b/code/modules/xenoarcheaology/effects/cellcharge.dm
index b5c8e6224b..42f64eb8dd 100644
--- a/code/modules/xenoarcheaology/effects/cellcharge.dm
+++ b/code/modules/xenoarcheaology/effects/cellcharge.dm
@@ -4,6 +4,8 @@
effect_type = EFFECT_ELECTRO
var/last_message
+ effect_color = "#ffee06"
+
/datum/artifact_effect/cellcharge/DoEffectTouch(var/mob/user)
if(user)
if(isrobot(user))
@@ -14,6 +16,7 @@
return 1
/datum/artifact_effect/cellcharge/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
@@ -42,6 +45,7 @@
return 1
/datum/artifact_effect/cellcharge/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
diff --git a/code/modules/xenoarcheaology/effects/celldrain.dm b/code/modules/xenoarcheaology/effects/celldrain.dm
index ee279032ec..c8a270c059 100644
--- a/code/modules/xenoarcheaology/effects/celldrain.dm
+++ b/code/modules/xenoarcheaology/effects/celldrain.dm
@@ -4,6 +4,9 @@
effect_type = EFFECT_ELECTRO
var/last_message
+ effect_state = "pulsing"
+ effect_color = "#fbff02"
+
/datum/artifact_effect/celldrain/DoEffectTouch(var/mob/user)
if(user)
if(istype(user, /mob/living/silicon/robot))
@@ -16,6 +19,7 @@
return 1
/datum/artifact_effect/celldrain/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
@@ -44,6 +48,7 @@
return 1
/datum/artifact_effect/celldrain/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
diff --git a/code/modules/xenoarcheaology/effects/cold.dm b/code/modules/xenoarcheaology/effects/cold.dm
index 9855ac280b..f20fdf00d5 100644
--- a/code/modules/xenoarcheaology/effects/cold.dm
+++ b/code/modules/xenoarcheaology/effects/cold.dm
@@ -3,6 +3,8 @@
name = "cold"
var/target_temp
+ effect_color = "#b3f6ff"
+
/datum/artifact_effect/cold/New()
..()
target_temp = rand(0, 250)
@@ -10,6 +12,7 @@
effect_type = pick(EFFECT_ORGANIC, EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/cold/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
to_chat(user, "A chill passes up your spine!")
var/datum/gas_mixture/env = holder.loc.return_air()
@@ -17,6 +20,7 @@
env.temperature = max(env.temperature - rand(5,50), 0)
/datum/artifact_effect/cold/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/datum/gas_mixture/env = holder.loc.return_air()
if(env && env.temperature > target_temp)
diff --git a/code/modules/xenoarcheaology/effects/dnaswitch.dm b/code/modules/xenoarcheaology/effects/dnaswitch.dm
index c4c36cb5b1..f9d20475f7 100644
--- a/code/modules/xenoarcheaology/effects/dnaswitch.dm
+++ b/code/modules/xenoarcheaology/effects/dnaswitch.dm
@@ -4,6 +4,9 @@
effect_type = EFFECT_ORGANIC
var/severity
+ effect_state = "smoke"
+ effect_color = "#77ff83"
+
/datum/artifact_effect/dnaswitch/New()
..()
if(effect == EFFECT_AURA)
@@ -28,6 +31,7 @@
return 1
/datum/artifact_effect/dnaswitch/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -47,6 +51,7 @@
scramble(0, H, weakness * severity)
/datum/artifact_effect/dnaswitch/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/carbon/human/H in range(200, T))
diff --git a/code/modules/xenoarcheaology/effects/electric_field.dm b/code/modules/xenoarcheaology/effects/electric_field.dm
index 3b27e8fe42..1ba181bb45 100644
--- a/code/modules/xenoarcheaology/effects/electric_field.dm
+++ b/code/modules/xenoarcheaology/effects/electric_field.dm
@@ -3,7 +3,10 @@
name = "electric field"
effect_type = EFFECT_ENERGY
+ effect_color = "#ffff00"
+
/datum/artifact_effect/electric_field/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
var/list/nearby_mobs = list()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
if(L == user) // You're "grounded" when you contact the artifact.
@@ -27,6 +30,7 @@
L.electrocute_act(rand(25, 40), holder, 0.75, BP_TORSO)
/datum/artifact_effect/electric_field/DoEffectAura()
+ var/atom/holder = get_master_holder()
var/list/nearby_mobs = list()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
if(!L.stat)
@@ -48,6 +52,7 @@
L.electrocute_act(rand(1, 10), holder, 0.75, BP_TORSO)
/datum/artifact_effect/electric_field/DoEffectPulse()
+ var/atom/holder = get_master_holder()
var/list/nearby_mobs = list()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
if(!L.stat)
diff --git a/code/modules/xenoarcheaology/effects/emp.dm b/code/modules/xenoarcheaology/effects/emp.dm
index fd30420b57..8b9d969a3e 100644
--- a/code/modules/xenoarcheaology/effects/emp.dm
+++ b/code/modules/xenoarcheaology/effects/emp.dm
@@ -2,11 +2,14 @@
name = "emp"
effect_type = EFFECT_ELECTRO
+ effect_state = "empdisable"
+
/datum/artifact_effect/emp/New()
..()
effect = EFFECT_PULSE
/datum/artifact_effect/emp/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
empulse(T, effectrange/4, effectrange/3, effectrange/2, effectrange)
diff --git a/code/modules/xenoarcheaology/effects/feysight.dm b/code/modules/xenoarcheaology/effects/feysight.dm
index 379dc0cc54..70bceb7bcc 100644
--- a/code/modules/xenoarcheaology/effects/feysight.dm
+++ b/code/modules/xenoarcheaology/effects/feysight.dm
@@ -2,6 +2,9 @@
name = "feysight"
effect_type = EFFECT_PSIONIC
+ effect_state = "pulsing"
+ effect_color = "#00c763"
+
/datum/artifact_effect/feysight/proc/apply_modifier(var/mob/living/L)
if(!istype(L))
return FALSE
@@ -28,6 +31,7 @@
return TRUE
/datum/artifact_effect/feysight/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
@@ -36,6 +40,7 @@
return TRUE
/datum/artifact_effect/feysight/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/forcefield.dm b/code/modules/xenoarcheaology/effects/forcefield.dm
index f4f1a3ab07..661563ccc7 100644
--- a/code/modules/xenoarcheaology/effects/forcefield.dm
+++ b/code/modules/xenoarcheaology/effects/forcefield.dm
@@ -3,11 +3,15 @@
var/list/created_field = list()
effect_type = EFFECT_PARTICLE
+ effect_state = "shield-old"
+ effect_color = "#00b7ff"
+
/datum/artifact_effect/forcefield/New()
..()
trigger = TRIGGER_TOUCH
/datum/artifact_effect/forcefield/ToggleActivate()
+ var/atom/holder = get_master_holder()
..()
if(created_field.len)
for(var/obj/effect/energy_field/F in created_field)
@@ -35,6 +39,7 @@
E.adjust_strength(0.25, 0)
/datum/artifact_effect/forcefield/UpdateMove()
+ var/atom/holder = get_master_holder()
if(created_field.len && holder)
var/turf/T = get_turf(holder)
while(created_field.len < 16)
diff --git a/code/modules/xenoarcheaology/effects/gaia.dm b/code/modules/xenoarcheaology/effects/gaia.dm
index 1a89149818..42869fd556 100644
--- a/code/modules/xenoarcheaology/effects/gaia.dm
+++ b/code/modules/xenoarcheaology/effects/gaia.dm
@@ -5,6 +5,8 @@
var/list/my_glitterflies = list()
+ effect_color = "#8cd448"
+
/datum/artifact_effect/gaia/proc/age_plantlife(var/obj/machinery/portable_atmospherics/hydroponics/Tray = null)
if(istype(Tray) && Tray.seed)
Tray.health += rand(1,3) * HYDRO_SPEED_MULTIPLIER
@@ -30,6 +32,7 @@
P.update_icon()
/datum/artifact_effect/gaia/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
to_chat(user, "You feel the presence of something long forgotten.")
for(var/obj/machinery/portable_atmospherics/hydroponics/Tray in view(world.view,get_turf(holder)))
age_plantlife(Tray)
@@ -44,6 +47,7 @@
age_plantlife(P)
/datum/artifact_effect/gaia/DoEffectAura()
+ var/atom/holder = get_master_holder()
for(var/obj/machinery/portable_atmospherics/hydroponics/Tray in view(effectrange,holder))
age_plantlife(Tray)
if(prob(2))
@@ -57,6 +61,7 @@
age_plantlife(P)
/datum/artifact_effect/gaia/DoEffectPulse()
+ var/atom/holder = get_master_holder()
for(var/obj/machinery/portable_atmospherics/hydroponics/Tray in view(effectrange,holder))
age_plantlife(Tray)
if(prob(10))
@@ -70,6 +75,7 @@
age_plantlife(P)
/datum/artifact_effect/gaia/process()
+ var/atom/holder = get_master_holder()
..()
listclearnulls(my_glitterflies)
diff --git a/code/modules/xenoarcheaology/effects/gasco2.dm b/code/modules/xenoarcheaology/effects/gasco2.dm
index 264dca7352..5543517dac 100644
--- a/code/modules/xenoarcheaology/effects/gasco2.dm
+++ b/code/modules/xenoarcheaology/effects/gasco2.dm
@@ -1,18 +1,22 @@
/datum/artifact_effect/gasco2
name = "CO2 creation"
+ effect_color = "#a5a5a5"
+
/datum/artifact_effect/gasco2/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasco2/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("carbon_dioxide", rand(2, 15))
/datum/artifact_effect/gasco2/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gasnitro.dm b/code/modules/xenoarcheaology/effects/gasnitro.dm
index 42b440fc1c..e076ff3aa3 100644
--- a/code/modules/xenoarcheaology/effects/gasnitro.dm
+++ b/code/modules/xenoarcheaology/effects/gasnitro.dm
@@ -1,18 +1,22 @@
/datum/artifact_effect/gasnitro
name = "N2 creation"
+ effect_color = "#c2d3d8"
+
/datum/artifact_effect/gasnitro/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasnitro/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("nitrogen", rand(2, 15))
/datum/artifact_effect/gasnitro/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gasoxy.dm b/code/modules/xenoarcheaology/effects/gasoxy.dm
index bb159509dc..798154e38a 100644
--- a/code/modules/xenoarcheaology/effects/gasoxy.dm
+++ b/code/modules/xenoarcheaology/effects/gasoxy.dm
@@ -7,12 +7,14 @@
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasoxy/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("oxygen", rand(2, 15))
/datum/artifact_effect/gasoxy/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gasphoron.dm b/code/modules/xenoarcheaology/effects/gasphoron.dm
index b84296fbb8..66cdee98c2 100644
--- a/code/modules/xenoarcheaology/effects/gasphoron.dm
+++ b/code/modules/xenoarcheaology/effects/gasphoron.dm
@@ -1,18 +1,22 @@
/datum/artifact_effect/gasphoron
name = "phoron creation"
+ effect_color = "#c408ba"
+
/datum/artifact_effect/gasphoron/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasphoron/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("phoron", rand(2, 15))
/datum/artifact_effect/gasphoron/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gassleeping.dm b/code/modules/xenoarcheaology/effects/gassleeping.dm
index 3c12f8f91c..a77ca5b88d 100644
--- a/code/modules/xenoarcheaology/effects/gassleeping.dm
+++ b/code/modules/xenoarcheaology/effects/gassleeping.dm
@@ -7,12 +7,14 @@
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gassleeping/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("nitrous_oxide", rand(2, 15))
/datum/artifact_effect/gassleeping/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/goodfeeling.dm b/code/modules/xenoarcheaology/effects/goodfeeling.dm
index c5d05adc5e..42b1be7e3a 100644
--- a/code/modules/xenoarcheaology/effects/goodfeeling.dm
+++ b/code/modules/xenoarcheaology/effects/goodfeeling.dm
@@ -23,6 +23,9 @@
"You're so happy suddenly, you almost want to dance and sing.",
"You feel like the world is out to help you.")
+ effect_state = "summoning"
+ effect_color = "#009118"
+
/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user)
if(user)
if (istype(user, /mob/living/carbon/human))
@@ -37,6 +40,7 @@
H.dizziness += rand(3,5)
/datum/artifact_effect/goodfeeling/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -51,6 +55,7 @@
return 1
/datum/artifact_effect/goodfeeling/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/gravitational_waves.dm b/code/modules/xenoarcheaology/effects/gravitational_waves.dm
index 6798eef64c..d34b352ea0 100644
--- a/code/modules/xenoarcheaology/effects/gravitational_waves.dm
+++ b/code/modules/xenoarcheaology/effects/gravitational_waves.dm
@@ -5,10 +5,14 @@
var/last_wave_pull = 0
+ effect_state = "gravisphere"
+ effect_color = "#d8c3ff"
+
/datum/artifact_effect/gravity_wave/DoEffectTouch(var/mob/user)
gravwave(user, effectrange, STAGE_TWO)
/datum/artifact_effect/gravity_wave/DoEffectAura()
+ var/atom/holder = get_master_holder()
var/seconds_since_last_pull = max(0, round((last_wave_pull - world.time) / 10))
if(prob(10 + seconds_since_last_pull))
@@ -17,6 +21,7 @@
gravwave(get_turf(holder), effectrange, STAGE_TWO)
/datum/artifact_effect/gravity_wave/DoEffectPulse()
+ var/atom/holder = get_master_holder()
holder.visible_message("\The [holder] distorts as local gravity intensifies, and shifts toward it.")
gravwave(get_turf(holder), effectrange, STAGE_TWO)
diff --git a/code/modules/xenoarcheaology/effects/heal.dm b/code/modules/xenoarcheaology/effects/heal.dm
index 39bb09d04e..313bbc011e 100644
--- a/code/modules/xenoarcheaology/effects/heal.dm
+++ b/code/modules/xenoarcheaology/effects/heal.dm
@@ -1,6 +1,7 @@
/datum/artifact_effect/heal
name = "heal"
effect_type = EFFECT_ORGANIC
+ effect_color = "#4649ff"
/datum/artifact_effect/heal/DoEffectTouch(var/mob/toucher)
//todo: check over this properly
@@ -33,6 +34,7 @@
return 1
/datum/artifact_effect/heal/DoEffectAura()
+ var/atom/holder = get_master_holder()
//todo: check over this properly
if(holder)
var/turf/T = get_turf(holder)
@@ -49,6 +51,7 @@
C.updatehealth()
/datum/artifact_effect/heal/DoEffectPulse()
+ var/atom/holder = get_master_holder()
//todo: check over this properly
if(holder)
var/turf/T = get_turf(holder)
diff --git a/code/modules/xenoarcheaology/effects/heat.dm b/code/modules/xenoarcheaology/effects/heat.dm
index 720d146443..0bb3ae1f10 100644
--- a/code/modules/xenoarcheaology/effects/heat.dm
+++ b/code/modules/xenoarcheaology/effects/heat.dm
@@ -2,6 +2,7 @@
/datum/artifact_effect/heat
name = "heat"
var/target_temp
+ effect_color = "#ff6600"
/datum/artifact_effect/heat/New()
..()
@@ -10,6 +11,7 @@
target_temp = rand(300, 600)
/datum/artifact_effect/heat/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
to_chat(user, " You feel a wave of heat travel up your spine!")
var/datum/gas_mixture/env = holder.loc.return_air()
@@ -17,6 +19,7 @@
env.temperature += rand(5,50)
/datum/artifact_effect/heat/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/datum/gas_mixture/env = holder.loc.return_air()
if(env && env.temperature < target_temp)
diff --git a/code/modules/xenoarcheaology/effects/hurt.dm b/code/modules/xenoarcheaology/effects/hurt.dm
index 14aff4e624..a2c8d54163 100644
--- a/code/modules/xenoarcheaology/effects/hurt.dm
+++ b/code/modules/xenoarcheaology/effects/hurt.dm
@@ -2,6 +2,8 @@
name = "hurt"
effect_type = EFFECT_ORGANIC
+ effect_color = "#6d1212"
+
/datum/artifact_effect/hurt/DoEffectTouch(var/mob/toucher)
if(toucher)
var/weakness = GetAnomalySusceptibility(toucher)
@@ -20,6 +22,7 @@
C.weakened += 6 * weakness
/datum/artifact_effect/hurt/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(src.effectrange,T))
@@ -35,6 +38,7 @@
C.updatehealth()
/datum/artifact_effect/hurt/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(effectrange, T))
diff --git a/code/modules/xenoarcheaology/effects/poltergeist.dm b/code/modules/xenoarcheaology/effects/poltergeist.dm
index 189c0ea4cd..5b270fd38c 100644
--- a/code/modules/xenoarcheaology/effects/poltergeist.dm
+++ b/code/modules/xenoarcheaology/effects/poltergeist.dm
@@ -3,6 +3,9 @@
name = "poltergeist"
effect_type = EFFECT_ENERGY
+ effect_state = "shield2"
+ effect_color = "#a824c9"
+
/datum/artifact_effect/poltergeist/proc/throw_at_mob(var/mob/living/target, var/damage = 20)
var/list/valid_targets = list()
@@ -19,6 +22,7 @@
throw_at_mob(user, rand(10, 30))
/datum/artifact_effect/poltergeist/DoEffectAura()
+ var/atom/holder = get_master_holder()
var/mob/living/target = null
for(var/mob/living/L in oview(get_turf(holder), effectrange))
if(L.stat || !L.mind)
@@ -33,6 +37,7 @@
throw_at_mob(target, rand(15, 30))
/datum/artifact_effect/poltergeist/DoEffectPulse()
+ var/atom/holder = get_master_holder()
var/mob/living/target = null
for(var/mob/living/L in oview(get_turf(holder), effectrange))
if(L.stat || !L.mind)
diff --git a/code/modules/xenoarcheaology/effects/radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm
index e38540eb04..88a37b3e06 100644
--- a/code/modules/xenoarcheaology/effects/radiate.dm
+++ b/code/modules/xenoarcheaology/effects/radiate.dm
@@ -2,6 +2,8 @@
name = "radiation"
var/radiation_amount
+ effect_color = "#007006"
+
/datum/artifact_effect/radiate/New()
..()
radiation_amount = rand(1, 10)
@@ -14,11 +16,13 @@
return 1
/datum/artifact_effect/radiate/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
SSradiation.flat_radiate(holder, radiation_amount, src.effectrange)
return 1
/datum/artifact_effect/radiate/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
SSradiation.radiate(holder, ((radiation_amount * 3) * (sqrt(src.effectrange)))) //Need to get feedback on this //VOREStation Edit - Was too crazy-strong.
return 1
diff --git a/code/modules/xenoarcheaology/effects/resurrect.dm b/code/modules/xenoarcheaology/effects/resurrect.dm
index e54ca276ea..0fbb8c6aef 100644
--- a/code/modules/xenoarcheaology/effects/resurrect.dm
+++ b/code/modules/xenoarcheaology/effects/resurrect.dm
@@ -4,7 +4,11 @@
var/stored_life = 0
+ effect_state = "pulsing"
+ effect_color = "#ff0000"
+
/datum/artifact_effect/resurrect/proc/steal_life(var/mob/living/target = null)
+ var/atom/holder = get_master_holder()
if(!istype(target))
return 0
@@ -16,6 +20,7 @@
return 0
/datum/artifact_effect/resurrect/proc/give_life(var/mob/living/target = null)
+ var/atom/holder = get_master_holder()
if(!istype(target))
return
@@ -34,6 +39,7 @@
stored_life = 0
/datum/artifact_effect/resurrect/proc/attempt_revive(var/mob/living/L = null)
+ var/atom/holder = get_master_holder()
spawn()
if(istype(L, /mob/living/simple_mob))
var/mob/living/simple_mob/SM = L
@@ -70,6 +76,7 @@
holder.visible_message("\The [H]'s eyes open in a flash of light!")
/datum/artifact_effect/resurrect/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
stored_life += 4 * steal_life(L)
@@ -80,6 +87,7 @@
break
/datum/artifact_effect/resurrect/DoEffectAura()
+ var/atom/holder = get_master_holder()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
stored_life += steal_life(L)
@@ -90,6 +98,7 @@
break
/datum/artifact_effect/resurrect/DoEffectPulse()
+ var/atom/holder = get_master_holder()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
stored_life += 2 * steal_life(L)
diff --git a/code/modules/xenoarcheaology/effects/roboheal.dm b/code/modules/xenoarcheaology/effects/roboheal.dm
index 0052a53979..16660029b7 100644
--- a/code/modules/xenoarcheaology/effects/roboheal.dm
+++ b/code/modules/xenoarcheaology/effects/roboheal.dm
@@ -2,6 +2,8 @@
name = "robotic healing"
var/last_message
+ effect_color = "#3879ad"
+
/datum/artifact_effect/roboheal/New()
..()
effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE)
@@ -16,6 +18,7 @@
return 1
/datum/artifact_effect/roboheal/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
@@ -28,6 +31,7 @@
return 1
/datum/artifact_effect/roboheal/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/robohurt.dm b/code/modules/xenoarcheaology/effects/robohurt.dm
index 8ed47a9e28..8b93e04ead 100644
--- a/code/modules/xenoarcheaology/effects/robohurt.dm
+++ b/code/modules/xenoarcheaology/effects/robohurt.dm
@@ -2,6 +2,8 @@
name = "robotic harm"
var/last_message
+ effect_color = "#5432cf"
+
/datum/artifact_effect/robohurt/New()
..()
effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE)
@@ -16,6 +18,7 @@
return 1
/datum/artifact_effect/robohurt/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
@@ -28,6 +31,7 @@
return 1
/datum/artifact_effect/robohurt/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/sleepy.dm b/code/modules/xenoarcheaology/effects/sleepy.dm
index 6a0439460a..244814a1da 100644
--- a/code/modules/xenoarcheaology/effects/sleepy.dm
+++ b/code/modules/xenoarcheaology/effects/sleepy.dm
@@ -1,6 +1,7 @@
//todo
/datum/artifact_effect/sleepy
name = "sleepy"
+ effect_color = "#a36fa1"
/datum/artifact_effect/sleepy/New()
..()
@@ -20,6 +21,7 @@
return 1
/datum/artifact_effect/sleepy/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -34,6 +36,7 @@
return 1
/datum/artifact_effect/sleepy/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/carbon/human/H in range(src.effectrange, T))
diff --git a/code/modules/xenoarcheaology/effects/stun.dm b/code/modules/xenoarcheaology/effects/stun.dm
index ab00465477..12ca276b93 100644
--- a/code/modules/xenoarcheaology/effects/stun.dm
+++ b/code/modules/xenoarcheaology/effects/stun.dm
@@ -1,5 +1,6 @@
/datum/artifact_effect/stun
name = "stun"
+ effect_color = "#00eeff"
/datum/artifact_effect/stun/New()
..()
@@ -16,6 +17,7 @@
C.Stun(rand(1,10) * susceptibility)
/datum/artifact_effect/stun/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(src.effectrange,T))
@@ -30,6 +32,7 @@
to_chat(C, "You feel numb.")
/datum/artifact_effect/stun/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/teleport.dm b/code/modules/xenoarcheaology/effects/teleport.dm
index 36b90afd31..2c766323db 100644
--- a/code/modules/xenoarcheaology/effects/teleport.dm
+++ b/code/modules/xenoarcheaology/effects/teleport.dm
@@ -1,8 +1,11 @@
/datum/artifact_effect/teleport
name = "teleport"
effect_type = EFFECT_BLUESPACE
+ effect_state = "pulsing"
+ effect_color = "#88ffdb"
/datum/artifact_effect/teleport/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
var/weakness = GetAnomalySusceptibility(user)
if(prob(100 * weakness))
to_chat(user, "You are suddenly zapped away elsewhere!")
@@ -20,6 +23,7 @@
sparks.start()
/datum/artifact_effect/teleport/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/M in range(src.effectrange,T))
@@ -39,6 +43,7 @@
sparks.start()
/datum/artifact_effect/teleport/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/M in range(src.effectrange, T))
diff --git a/code/modules/xenoarcheaology/effects/vampire.dm b/code/modules/xenoarcheaology/effects/vampire.dm
index e5a069b935..7c6ed91a5f 100644
--- a/code/modules/xenoarcheaology/effects/vampire.dm
+++ b/code/modules/xenoarcheaology/effects/vampire.dm
@@ -9,7 +9,11 @@
var/charges = 0
var/list/nearby_mobs = list()
+ effect_state = "gravisphere"
+ effect_color = "#ff0000"
+
/datum/artifact_effect/vampire/proc/bloodcall(var/mob/living/carbon/human/M)
+ var/atom/holder = get_master_holder()
last_bloodcall = world.time
if(istype(M))
playsound(holder, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3)
@@ -23,30 +27,29 @@
B.target_turf = pick(range(1, get_turf(holder)))
B.blood_DNA = list()
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
- M.vessel.remove_reagent("blood",rand(25,50))
+ M.vessel.remove_reagent("blood",rand(10,30))
/datum/artifact_effect/vampire/DoEffectTouch(var/mob/user)
bloodcall(user)
DoEffectAura()
/datum/artifact_effect/vampire/DoEffectAura()
- if (nearby_mobs.len)
+ var/atom/holder = get_master_holder()
+ if(nearby_mobs.len)
nearby_mobs.Cut()
-
var/turf/T = get_turf(holder)
for(var/mob/living/L in oview(effectrange, T))
if(!L.stat && L.mind)
nearby_mobs |= L
- if(world.time - last_bloodcall > bloodcall_interval && nearby_mobs.len)
+ if(world.time - bloodcall_interval >= last_bloodcall && LAZYLEN(nearby_mobs))
var/mob/living/carbon/human/M = pick(nearby_mobs)
- if(M in view(effectrange,holder) && M.health > 20)
- if(prob(50))
- bloodcall(M)
- holder.Beam(M, icon_state = "drainbeam", time = 1 SECOND)
+ if(get_dist(M, T) <= effectrange && M.health > 20)
+ bloodcall(M)
+ holder.Beam(M, icon_state = "drainbeam", time = 1 SECOND)
- if(world.time - last_eat > eat_interval)
+ if(world.time - last_eat >= eat_interval)
var/obj/effect/decal/cleanable/blood/B = locate() in range(2,holder)
if(B)
last_eat = world.time
@@ -62,13 +65,13 @@
if(charges >= 10)
charges -= 10
var/manifestation = pick(/obj/item/device/soulstone, /mob/living/simple_mob/faithless/cult/strong, /mob/living/simple_mob/creature/cult/strong, /mob/living/simple_mob/animal/space/bats/cult/strong)
- new manifestation(get_turf(pick(view(1,T))))
+ new manifestation(pick(RANGE_TURFS(1,T)))
if(charges >= 3)
if(prob(5))
charges -= 1
var/spawn_type = pick(/mob/living/simple_mob/animal/space/bats, /mob/living/simple_mob/creature, /mob/living/simple_mob/faithless)
- new spawn_type(get_turf(pick(view(1,T))))
+ new spawn_type(pick(RANGE_TURFS(1,T)))
playsound(holder, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3)
if(charges >= 1 && nearby_mobs.len && prob(15 * nearby_mobs.len))
diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm
index 59cb611c71..28c58b32a6 100644
--- a/code/modules/xenoarcheaology/finds/find_spawning.dm
+++ b/code/modules/xenoarcheaology/finds/find_spawning.dm
@@ -15,18 +15,20 @@
var/additional_desc = ""
var/obj/item/weapon/new_item
var/source_material = ""
- var/apply_material_decorations = 1
- var/apply_image_decorations = 0
+ var/apply_material_decorations = TRUE
+ var/apply_image_decorations = FALSE
var/material_descriptor = ""
- var/apply_prefix = 1
+ var/apply_prefix = TRUE
+
+ var/become_anomalous = FALSE
if(prob(40))
material_descriptor = pick("rusted ","dusty ","archaic ","fragile ", "damaged", "pristine")
source_material = pick("cordite","quadrinium","steel","titanium","aluminium","ferritic-alloy","plasteel","duranium")
- var/talkative = 0
+ var/talkative = FALSE
if(prob(5))
- talkative = 1
+ talkative = TRUE
//for all items here:
//icon_state
@@ -41,7 +43,7 @@
new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = "bowl"
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(prob(40))
new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
if(prob(20))
@@ -55,7 +57,7 @@
new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = "urn[rand(1,2)]"
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(prob(20))
additional_desc = "It [pick("whispers faintly","makes a quiet roaring sound","whistles softly","thrums quietly","throbs")] if you put it to your ear."
if(ARCHAEO_CUTLERY)
@@ -88,7 +90,9 @@
item_type = "instrument"
icon_state = "instrument"
if(prob(30))
- apply_image_decorations = 1
+ become_anomalous = TRUE
+ if(prob(30))
+ apply_image_decorations = TRUE
additional_desc = "[pick("You're not sure how anyone could have played this",\
"You wonder how many mouths the creator had",\
"You wonder what it sounds like",\
@@ -109,16 +113,16 @@
chance += 10
item_type = new_item.name
- apply_prefix = 0
- apply_material_decorations = 0
- apply_image_decorations = 1
+ apply_prefix = FALSE
+ apply_material_decorations = FALSE
+ apply_image_decorations = TRUE
if(ARCHAEO_HANDCUFFS)
item_type = "handcuffs"
new_item = new /obj/item/weapon/handcuffs(src.loc)
additional_desc = "[pick("They appear to be for securing two things together","Looks kinky","Doesn't seem like a children's toy")]."
if(ARCHAEO_BEARTRAP)
item_type = "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]"
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/beartrap(src.loc)
if(prob(40))
new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
@@ -130,7 +134,7 @@
new_item = new /obj/item/weapon/flame/lighter(src.loc)
additional_desc = "There is a tiny device attached."
if(prob(30))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_BOX)
item_type = "box"
new_item = new /obj/item/weapon/storage/box(src.loc)
@@ -142,7 +146,7 @@
new_box.max_storage_space = rand(storage_amount, storage_amount * 10)
if(prob(30))
LAZYSET(new_item.origin_tech, TECH_ARCANE, 1)
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_GASTANK)
item_type = "[pick("cylinder","tank","chamber")]"
if(prob(25))
@@ -163,12 +167,12 @@
new_item = new /obj/item/weapon/tool/screwdriver(src.loc)
if(prob(40))
new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
additional_desc = "[pick("It doesn't look safe.",\
"You wonder what it was used for",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains on it")]."
if(ARCHAEO_METAL)
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
var/list/possible_spawns = list()
possible_spawns += /obj/item/stack/material/steel
possible_spawns += /obj/item/stack/material/plasteel
@@ -193,9 +197,11 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pen1"
LAZYSET(new_item.origin_tech, TECH_ARCANE, 1)
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_CRYSTAL)
- apply_prefix = 0
+ if(prob(40))
+ become_anomalous = TRUE
+ apply_prefix = FALSE
if(prob(25))
icon = 'icons/obj/xenoarchaeology.dmi'
item_type = "smooth green crystal"
@@ -210,9 +216,9 @@
icon_state = "changerock"
additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.")
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
if(prob(10))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(prob(25))
new_item = new /obj/item/device/soulstone(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
@@ -220,18 +226,18 @@
LAZYSET(new_item.origin_tech, TECH_ARCANE, 2)
if(ARCHAEO_CULTBLADE)
//cultblade
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/melee/cultblade(src.loc)
- apply_material_decorations = 0
- apply_image_decorations = 0
+ apply_material_decorations = FALSE
+ apply_image_decorations = FALSE
if(ARCHAEO_TELEBEACON)
new_item = new /obj/item/device/radio/beacon(src.loc)
- talkative = 0
+ talkative = FALSE
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = "unknown[rand(1,4)]"
new_item.desc = ""
if(ARCHAEO_CLAYMORE)
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/material/sword(src.loc)
new_item.force = 10
new_item.name = pick("great-sword","claymore","longsword","broadsword","shortsword","gladius")
@@ -241,7 +247,7 @@
new_item.icon_state = "blade1"
if(ARCHAEO_CULTROBES)
//arcane clothing
- apply_prefix = 0
+ apply_prefix = FALSE
var/list/possible_spawns = list(/obj/item/clothing/head/culthood,
/obj/item/clothing/head/culthood/magus,
/obj/item/clothing/head/culthood/alt,
@@ -252,25 +258,28 @@
LAZYSET(new_item.origin_tech, TECH_ARCANE, 1)
if(ARCHAEO_SOULSTONE)
//soulstone
- apply_prefix = 0
+ become_anomalous = TRUE
+ apply_prefix = FALSE
new_item = new /obj/item/device/soulstone(src.loc)
item_type = new_item.name
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
LAZYSET(new_item.origin_tech, TECH_ARCANE, 2)
if(ARCHAEO_SHARD)
if(prob(50))
new_item = new /obj/item/weapon/material/shard(src.loc)
else
new_item = new /obj/item/weapon/material/shard/phoron(src.loc)
- apply_prefix = 0
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_prefix = FALSE
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_RODS)
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/stack/rods(src.loc)
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_STOCKPARTS)
+ if(prob(30))
+ become_anomalous = TRUE
var/list/possible_spawns = typesof(/obj/item/weapon/stock_parts)
possible_spawns -= /obj/item/weapon/stock_parts
possible_spawns -= /obj/item/weapon/stock_parts/subspace
@@ -278,9 +287,9 @@
var/new_type = pick(possible_spawns)
new_item = new new_type(src.loc)
item_type = new_item.name
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
if(ARCHAEO_KATANA)
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/material/sword/katana(src.loc)
new_item.force = 10
new_item.name = "katana"
@@ -349,9 +358,11 @@
item_type = "gun"
if(ARCHAEO_UNKNOWN)
+ if(prob(20))
+ become_anomalous = TRUE
//completely unknown alien device
if(prob(50))
- apply_image_decorations = 0
+ apply_image_decorations = FALSE
if(ARCHAEO_FOSSIL)
//fossil bone/skull
//new_item = new /obj/item/weapon/fossil/base(src.loc)
@@ -362,30 +373,30 @@
var/spawn_type = pickweight(candidates)
new_item = new spawn_type(src.loc)
- apply_prefix = 0
+ apply_prefix = FALSE
additional_desc = "A fossilised part of an alien, long dead."
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_SHELL)
//fossil shell
new_item = new /obj/item/weapon/fossil/shell(src.loc)
- apply_prefix = 0
+ apply_prefix = FALSE
additional_desc = "A fossilised, pre-Stygian alien crustacean."
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(prob(10))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_PLANT)
//fossil plant
new_item = new /obj/item/weapon/fossil/plant(src.loc)
item_type = new_item.name
additional_desc = "A fossilised shred of alien plant matter."
- apply_image_decorations = 0
- apply_material_decorations = 0
- apply_prefix = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
+ apply_prefix = FALSE
if(ARCHAEO_REMAINS_HUMANOID)
//humanoid remains
- apply_prefix = 0
+ apply_prefix = FALSE
item_type = "humanoid [pick("remains","skeleton")]"
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
@@ -396,11 +407,11 @@
"The bones are scored by numerous burns and partially melted.",\
"The are battered and broken, in some cases less than splinters are left.",\
"The mouth is wide open in a death rictus, the victim would appear to have died screaming.")
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_REMAINS_ROBOT)
//robot remains
- apply_prefix = 0
+ apply_prefix = FALSE
item_type = "[pick("mechanical","robotic","cyborg")] [pick("remains","chassis","debris")]"
icon = 'icons/mob/robots.dmi'
icon_state = "remainsrobot"
@@ -411,11 +422,11 @@
"The chassis is scored by numerous burns and partially melted.",\
"The chassis is battered and broken, in some cases only chunks of metal are left.",\
"A pile of wires and crap metal that looks vaguely robotic.")
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_REMAINS_XENO)
//xenos remains
- apply_prefix = 0
+ apply_prefix = FALSE
item_type = "alien [pick("remains","skeleton")]"
icon = 'icons/effects/blood.dmi'
icon_state = "remainsxeno"
@@ -427,8 +438,8 @@
"The are battered and broken, in some cases less than splinters are left.",\
"This creature would have been twisted and monstrous when it was alive.",\
"It doesn't look human.")
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_GASMASK)
//gas mask
if(prob(25))
@@ -680,6 +691,9 @@
new_item.origin_tech[TECH_ARCANE] += 1
new_item.origin_tech[TECH_PRECURSOR] += 1
+ if(become_anomalous)
+ new_item.become_anomalous()
+
var/turf/simulated/mineral/T = get_turf(new_item)
if(istype(T))
T.last_find = new_item
@@ -691,3 +705,6 @@
LAZYINITLIST(origin_tech)
origin_tech[TECH_ARCANE] += 1
origin_tech[TECH_PRECURSOR] += 1
+
+ if(become_anomalous)
+ become_anomalous()
diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
index 44afa6ea2c..32259e774a 100644
--- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
@@ -138,13 +138,37 @@
var/obj/machinery/artifact/A = scanned_obj
var/out = "Anomalous alien device - composed of an unknown alloy.
"
- if(A.my_effect)
- out += A.my_effect.getDescription()
+ var/datum/component/artifact_master/AMast = A.artifact_master
+ var/datum/artifact_effect/AEff = AMast.get_primary()
- if(A.secondary_effect && A.secondary_effect.activated)
+ out += AEff.getDescription()
+
+ if(AMast.my_effects.len > 1)
out += "
Internal scans indicate ongoing secondary activity operating independently from primary systems.
"
- out += A.secondary_effect.getDescription()
+ for(var/datum/artifact_effect/my_effect in A.artifact_master.my_effects - AEff)
+
+ if(my_effect)
+ out += my_effect.getDescription()
return out
else
+
+ var/datum/component/artifact_master/ScannedMaster = scanned_obj.GetComponent(/datum/component/artifact_master)
+
+ if(istype(ScannedMaster))
+ var/out = "Anomalous reality warp - Object has been altered to disobey known laws of physics.
"
+
+ var/datum/artifact_effect/AEff = ScannedMaster.get_primary()
+
+ out += AEff.getDescription()
+
+ if(ScannedMaster.my_effects.len > 1)
+ out += "
Resonant scans indicate asynchronous reality modulation:
"
+ for(var/datum/artifact_effect/my_effect in ScannedMaster.my_effects - AEff)
+
+ if(my_effect)
+ out += my_effect.getDescription()
+
+ return out
+
return "[scanned_obj.name] - mundane application."
diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
index 05aa87442d..03f0fdb484 100644
--- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
@@ -148,10 +148,12 @@
cur_artifact = analysed
//if both effects are active, we can't harvest either
- if(cur_artifact.my_effect && cur_artifact.my_effect.activated && cur_artifact.secondary_effect && cur_artifact.secondary_effect.activated)
+ var/list/active_effects = cur_artifact.artifact_master.get_active_effects()
+
+ if(active_effects.len > 1)
atom_say("Cannot harvest. Source is emitting conflicting energy signatures.")
return
- if(!cur_artifact.my_effect.activated && !(cur_artifact.secondary_effect && cur_artifact.secondary_effect.activated))
+ else if(!active_effects.len)
atom_say("Cannot harvest. No energy emitting from source.")
return
@@ -163,34 +165,24 @@
//
var/datum/artifact_effect/source_effect
+ var/datum/artifact_effect/active_effect = active_effects[1]
//if we already have charge in the battery, we can only recharge it from the source artifact
if(inserted_battery.stored_charge > 0)
var/battery_matches_primary_id = 0
- if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.my_effect.artifact_id)
+ if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.artifact_master.artifact_id)
battery_matches_primary_id = 1
- if(battery_matches_primary_id && cur_artifact.my_effect.activated)
+ if(battery_matches_primary_id && active_effect.activated)
//we're good to recharge the primary effect!
- source_effect = cur_artifact.my_effect
-
- var/battery_matches_secondary_id = 0
- if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.secondary_effect.artifact_id)
- battery_matches_secondary_id = 1
- if(battery_matches_secondary_id && cur_artifact.secondary_effect.activated)
- //we're good to recharge the secondary effect!
- source_effect = cur_artifact.secondary_effect
+ source_effect = active_effect
if(!source_effect)
atom_say("Cannot harvest. Battery is charged with a different energy signature.")
else
//we're good to charge either
- if(cur_artifact.my_effect.activated)
+ if(active_effect.activated)
//charge the primary effect
- source_effect = cur_artifact.my_effect
-
- else if(cur_artifact.secondary_effect.activated)
- //charge the secondary effect
- source_effect = cur_artifact.secondary_effect
+ source_effect = active_effect
if(source_effect)
@@ -258,3 +250,134 @@
inserted_battery.battery_effect.ToggleActivate()
src.visible_message("[name] states, \"Battery dump completed.\"")
icon_state = "incubator"
+
+/obj/machinery/artifact_harvester/Topic(href, href_list)
+
+ if (href_list["harvest"])
+ if(!inserted_battery)
+ src.visible_message("[src] states, \"Cannot harvest. No battery inserted.\"")
+
+ else if(inserted_battery.stored_charge >= inserted_battery.capacity)
+ src.visible_message("[src] states, \"Cannot harvest. battery is full.\"")
+
+ else
+
+ //locate artifact on analysis pad
+ cur_artifact = null
+ var/articount = 0
+ var/obj/machinery/artifact/analysed
+ for(var/obj/machinery/artifact/A in get_turf(owned_scanner))
+ analysed = A
+ articount++
+
+ if(articount <= 0)
+ var/message = "[src] states, \"Cannot harvest. No noteworthy energy signature isolated.\""
+ src.visible_message(message)
+
+ else if(analysed && analysed.being_used)
+ src.visible_message("[src] states, \"Cannot harvest. Source already being harvested.\"")
+
+ else
+ if(articount > 1)
+ state("Cannot harvest. Too many artifacts on the pad.")
+ else if(analysed)
+ cur_artifact = analysed
+
+ //if both effects are active, we can't harvest either
+ var/list/active_effects = cur_artifact.artifact_master.get_active_effects()
+
+ if(active_effects.len > 1)
+ src.visible_message("[src] states, \"Cannot harvest. Source is emitting conflicting energy signatures.\"")
+ else if(!active_effects.len)
+ src.visible_message("[src] states, \"Cannot harvest. No energy emitting from source.\"")
+
+ else
+ //see if we can clear out an old effect
+ //delete it when the ids match to account for duplicate ids having different effects
+ if(inserted_battery.battery_effect && inserted_battery.stored_charge <= 0)
+ qdel(inserted_battery.battery_effect)
+ inserted_battery.battery_effect = null
+
+ //
+ var/datum/artifact_effect/source_effect
+ var/datum/artifact_effect/active_effect = active_effects[1]
+
+ //if we already have charge in the battery, we can only recharge it from the source artifact
+ if(inserted_battery.stored_charge > 0)
+ var/battery_matches_primary_id = 0
+ if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.artifact_master.artifact_id)
+ battery_matches_primary_id = 1
+ if(battery_matches_primary_id && active_effect.activated)
+ //we're good to recharge the primary effect!
+ source_effect = active_effect
+
+ if(!source_effect)
+ src.visible_message("[src] states, \"Cannot harvest. Battery is charged with a different energy signature.\"")
+ else
+ //we're good to charge either
+ if(active_effect.activated)
+ //charge the primary effect
+ source_effect = active_effect
+
+ if(source_effect)
+ harvesting = 1
+ update_use_power(USE_POWER_ACTIVE)
+ cur_artifact.anchored = 1
+ cur_artifact.being_used = 1
+ icon_state = "incubator_on"
+ var/message = "[src] states, \"Beginning energy harvesting.\""
+ src.visible_message(message)
+ last_process = world.time
+
+ //duplicate the artifact's effect datum
+ if(!inserted_battery.battery_effect)
+ var/effecttype = source_effect.type
+ var/datum/artifact_effect/E = new effecttype(inserted_battery)
+
+ //duplicate it's unique settings
+ for(var/varname in list("chargelevelmax","artifact_id","effect","effectrange","trigger"))
+ E.vars[varname] = source_effect.vars[varname]
+
+ //copy the new datum into the battery
+ inserted_battery.battery_effect = E
+ inserted_battery.stored_charge = 0
+
+ if (href_list["stopharvest"])
+ if(harvesting)
+ if(harvesting < 0 && inserted_battery.battery_effect && inserted_battery.battery_effect.activated)
+ inserted_battery.battery_effect.ToggleActivate()
+ harvesting = 0
+ cur_artifact.anchored = 0
+ cur_artifact.being_used = 0
+ cur_artifact = null
+ src.visible_message("[name] states, \"Energy harvesting interrupted.\"")
+ icon_state = "incubator"
+
+ if (href_list["ejectbattery"])
+ src.inserted_battery.loc = src.loc
+ src.inserted_battery = null
+
+ if (href_list["drainbattery"])
+ if(inserted_battery)
+ if(inserted_battery.battery_effect && inserted_battery.stored_charge > 0)
+ if(alert("This action will dump all charge, safety gear is recommended before proceeding","Warning","Continue","Cancel"))
+ if(!inserted_battery.battery_effect.activated)
+ inserted_battery.battery_effect.ToggleActivate(1)
+ last_process = world.time
+ harvesting = -1
+ update_use_power(USE_POWER_ACTIVE)
+ icon_state = "incubator_on"
+ var/message = "[src] states, \"Warning, battery charge dump commencing.\""
+ src.visible_message(message)
+ else
+ var/message = "[src] states, \"Cannot dump energy. Battery is drained of charge already.\""
+ src.visible_message(message)
+ else
+ var/message = "[src] states, \"Cannot dump energy. No battery inserted.\""
+ src.visible_message(message)
+
+ if(href_list["close"])
+ usr << browse(null, "window=artharvester")
+ usr.unset_machine(src)
+
+ updateDialog()
diff --git a/icons/inventory/belt/item.dmi b/icons/inventory/belt/item.dmi
index 8c32c4552b..bde59b458b 100644
Binary files a/icons/inventory/belt/item.dmi and b/icons/inventory/belt/item.dmi differ
diff --git a/icons/inventory/belt/mob.dmi b/icons/inventory/belt/mob.dmi
index 25de974858..a8e2aaacd7 100644
Binary files a/icons/inventory/belt/mob.dmi and b/icons/inventory/belt/mob.dmi differ
diff --git a/icons/inventory/hands/item_vr.dmi b/icons/inventory/hands/item_vr.dmi
index 749d4df189..302f4be618 100644
Binary files a/icons/inventory/hands/item_vr.dmi and b/icons/inventory/hands/item_vr.dmi differ
diff --git a/icons/inventory/hands/mob_vr.dmi b/icons/inventory/hands/mob_vr.dmi
index 3a8806e48c..8aed1c166d 100644
Binary files a/icons/inventory/hands/mob_vr.dmi and b/icons/inventory/hands/mob_vr.dmi differ
diff --git a/icons/inventory/hands/mob_vr_teshari.dmi b/icons/inventory/hands/mob_vr_teshari.dmi
new file mode 100644
index 0000000000..2d79a8ac14
Binary files /dev/null and b/icons/inventory/hands/mob_vr_teshari.dmi differ
diff --git a/icons/inventory/hands/mob_vr_vox.dmi b/icons/inventory/hands/mob_vr_vox.dmi
new file mode 100644
index 0000000000..405ce4b76f
Binary files /dev/null and b/icons/inventory/hands/mob_vr_vox.dmi differ
diff --git a/icons/inventory/hands/mob_vr_werebeast.dmi b/icons/inventory/hands/mob_vr_werebeast.dmi
index 7b14f5bf96..f117406623 100644
Binary files a/icons/inventory/hands/mob_vr_werebeast.dmi and b/icons/inventory/hands/mob_vr_werebeast.dmi differ
diff --git a/icons/inventory/head/item.dmi b/icons/inventory/head/item.dmi
index bfdea47a73..76b8118409 100644
Binary files a/icons/inventory/head/item.dmi and b/icons/inventory/head/item.dmi differ
diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi
index 17728e25f6..0917a414bd 100644
Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ
diff --git a/icons/inventory/suit/item.dmi b/icons/inventory/suit/item.dmi
index 4e8e3f8657..e5d75cd19e 100644
Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ
diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi
index 9aa489853f..0eb7b2b6e1 100644
Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails.dmi b/icons/mob/human_races/sprite_accessories/tails.dmi
index 5e4a27597f..960a44d5e2 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails.dmi and b/icons/mob/human_races/sprite_accessories/tails.dmi differ
diff --git a/icons/mob/vore/ears_32x64.dmi b/icons/mob/vore/ears_32x64.dmi
index 4fd59c7e69..a661c9e3c7 100644
Binary files a/icons/mob/vore/ears_32x64.dmi and b/icons/mob/vore/ears_32x64.dmi differ
diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi
index 9d1c37b8da..d5a4d7ad57 100644
Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ
diff --git a/icons/obj/ammo_boxes.dmi b/icons/obj/ammo_boxes.dmi
new file mode 100644
index 0000000000..3706970041
Binary files /dev/null and b/icons/obj/ammo_boxes.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 871b922c9b..9de92931db 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/gun_toy.dmi b/icons/obj/gun_toy.dmi
new file mode 100644
index 0000000000..bee6bcc49d
Binary files /dev/null and b/icons/obj/gun_toy.dmi differ
diff --git a/icons/obj/objects_vr.dmi b/icons/obj/objects_vr.dmi
index db7f71aef3..0cfacc4fd0 100644
Binary files a/icons/obj/objects_vr.dmi and b/icons/obj/objects_vr.dmi differ
diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi
index 04239be49d..0195f8e6f4 100644
Binary files a/icons/obj/playing_cards.dmi and b/icons/obj/playing_cards.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index b7235b7e58..98519ef659 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/obj/toy_vr.dmi b/icons/obj/toy_vr.dmi
index 3ad106945b..9b3ca4d9d0 100644
Binary files a/icons/obj/toy_vr.dmi and b/icons/obj/toy_vr.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index a1fbfc9479..91285fd3a1 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/vore/custom_clothes_left_hand_vr.dmi b/icons/vore/custom_clothes_left_hand_vr.dmi
index ec5dd4b55a..17ac4c3a7e 100644
Binary files a/icons/vore/custom_clothes_left_hand_vr.dmi and b/icons/vore/custom_clothes_left_hand_vr.dmi differ
diff --git a/icons/vore/custom_clothes_right_hand_vr.dmi b/icons/vore/custom_clothes_right_hand_vr.dmi
index 2fc3bdb14f..d77e0fa248 100644
Binary files a/icons/vore/custom_clothes_right_hand_vr.dmi and b/icons/vore/custom_clothes_right_hand_vr.dmi differ
diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi
index 12d65818b1..cc7b242670 100644
Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ
diff --git a/icons/vore/custom_onmob_32x48_vr.dmi b/icons/vore/custom_onmob_32x48_vr.dmi
index 2889db5cc0..827ab1fb47 100644
Binary files a/icons/vore/custom_onmob_32x48_vr.dmi and b/icons/vore/custom_onmob_32x48_vr.dmi differ
diff --git a/icons/vore/custom_onmob_vr.dmi b/icons/vore/custom_onmob_vr.dmi
index 03c26ba63d..e90afae8d4 100644
Binary files a/icons/vore/custom_onmob_vr.dmi and b/icons/vore/custom_onmob_vr.dmi differ
diff --git a/maps/expedition_vr/beach/submaps/speakeasy_vr.dmm b/maps/expedition_vr/beach/submaps/speakeasy_vr.dmm
index d4e01a8df1..a817bd965c 100644
--- a/maps/expedition_vr/beach/submaps/speakeasy_vr.dmm
+++ b/maps/expedition_vr/beach/submaps/speakeasy_vr.dmm
@@ -1,54 +1,458 @@
-"a" = (/turf/template_noop,/area/submap/Speakeasy)
-"c" = (/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
-"f" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"g" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"h" = (/obj/random/handgun,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"i" = (/obj/item/clothing/head/fedora,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"j" = (/obj/structure/bookcase,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"k" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"l" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
-"m" = (/obj/structure/table/woodentable,/obj/machinery/light/poi{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"n" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"o" = (/obj/structure/simple_door/wood,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"p" = (/obj/machinery/media/jukebox,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"s" = (/obj/structure/bed/chair/wood{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"u" = (/obj/structure/table/gamblingtable,/obj/machinery/light/poi{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"v" = (/obj/structure/table/fancyblack,/obj/item/clothing/mask/smokable/cigarette/cigar,/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
-"w" = (/turf/simulated/wall/wood,/area/submap/Speakeasy)
-"x" = (/obj/structure/bed/chair/sofa/blue/left{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"B" = (/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"C" = (/turf/simulated/mineral/floor/cave,/area/submap/Speakeasy)
-"D" = (/obj/structure/bed/chair/sofa/black/corner{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"E" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
-"H" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"I" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"K" = (/obj/effect/floor_decal/corner/black/diagonal,/turf/simulated/floor/tiled/neutral,/area/submap/Speakeasy)
-"L" = (/obj/structure/bed/chair/wood{dir = 8},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"M" = (/obj/machinery/light/poi{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
-"N" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"O" = (/obj/machinery/light/poi{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"R" = (/obj/structure/bed/chair/sofa/black{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"U" = (/obj/structure/bed/chair/sofa/blue/right{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"V" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"W" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"X" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"Y" = (/obj/structure/table/fancyblack,/obj/random/cash/big,/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaa
-awwwwwwwwwwaaaaa
-awnnwBMlMBwwwwaa
-awiBjBYvYBwfLwwa
-awhBjBcEcBwgBBwa
-awwwwBBBBBwBWWwa
-awXHwwwowwwBNmwa
-awBBBOBBBBBBNNwa
-awVNININNIBBggwa
-awBkkkkkkkBBBBwa
-awpBBBBBBBKKKWwa
-awwxffBBBBKKKuwa
-aawDRUBBBBKKKgwa
-aawwwwBBBBsfLwwa
-aaaaawwowwwwwwaa
-aaaaaaCCCaaaaaaa
-"}
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/submap/Speakeasy)
+"c" = (
+/turf/simulated/floor/carpet/turcarpet,
+/area/submap/Speakeasy)
+"f" = (
+/obj/structure/table/gamblingtable,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"g" = (
+/obj/structure/bed/chair/wood{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"h" = (
+/obj/random/handgun,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"i" = (
+/obj/item/clothing/head/fedora,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"j" = (
+/obj/structure/bookcase,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"k" = (
+/obj/item/weapon/stool/padded,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"l" = (
+/obj/structure/bed/chair/comfy/black,
+/turf/simulated/floor/carpet/turcarpet,
+/area/submap/Speakeasy)
+"m" = (
+/obj/structure/table/woodentable,
+/obj/machinery/light/poi{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"n" = (
+/obj/structure/reagent_dispensers/beerkeg,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"o" = (
+/obj/structure/simple_door/wood,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"p" = (
+/obj/machinery/media/jukebox,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"s" = (
+/obj/structure/bed/chair/wood{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"u" = (
+/obj/structure/table/gamblingtable,
+/obj/machinery/light/poi{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"v" = (
+/obj/structure/table/fancyblack,
+/obj/item/clothing/mask/smokable/cigarette/cigar,
+/turf/simulated/floor/carpet/turcarpet,
+/area/submap/Speakeasy)
+"w" = (
+/turf/simulated/wall/wood,
+/area/submap/Speakeasy)
+"x" = (
+/obj/structure/bed/chair/sofa/left/blue{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"B" = (
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"C" = (
+/turf/simulated/mineral/floor/cave,
+/area/submap/Speakeasy)
+"D" = (
+/obj/structure/bed/chair/sofa/corner/black{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"E" = (
+/obj/structure/bed/chair/comfy/black{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/turcarpet,
+/area/submap/Speakeasy)
+"H" = (
+/obj/machinery/vending/boozeomat,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"I" = (
+/obj/structure/table/woodentable,
+/obj/random/drinkbottle,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"K" = (
+/obj/effect/floor_decal/corner/black/diagonal,
+/turf/simulated/floor/tiled/neutral,
+/area/submap/Speakeasy)
+"L" = (
+/obj/structure/bed/chair/wood{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"M" = (
+/obj/machinery/light/poi{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/turcarpet,
+/area/submap/Speakeasy)
+"N" = (
+/obj/structure/table/woodentable,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"O" = (
+/obj/machinery/light/poi{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"R" = (
+/obj/structure/bed/chair/sofa/black{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"U" = (
+/obj/structure/bed/chair/sofa/right/blue{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"V" = (
+/obj/structure/table/woodentable,
+/obj/machinery/chemical_dispenser/bar_soft/full{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"W" = (
+/obj/structure/bed/chair/wood,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"X" = (
+/obj/structure/table/woodentable,
+/obj/machinery/chemical_dispenser/bar_alc/full,
+/turf/simulated/floor/wood,
+/area/submap/Speakeasy)
+"Y" = (
+/obj/structure/table/fancyblack,
+/obj/random/cash/big,
+/turf/simulated/floor/carpet/turcarpet,
+/area/submap/Speakeasy)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+w
+w
+w
+w
+w
+w
+w
+w
+w
+w
+w
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+w
+n
+i
+h
+w
+X
+B
+V
+B
+p
+w
+w
+w
+a
+a
+"}
+(4,1,1) = {"
+a
+w
+n
+B
+B
+w
+H
+B
+N
+k
+B
+x
+D
+w
+a
+a
+"}
+(5,1,1) = {"
+a
+w
+w
+j
+j
+w
+w
+B
+I
+k
+B
+f
+R
+w
+a
+a
+"}
+(6,1,1) = {"
+a
+w
+B
+B
+B
+B
+w
+O
+N
+k
+B
+f
+U
+w
+w
+a
+"}
+(7,1,1) = {"
+a
+w
+M
+Y
+c
+B
+w
+B
+I
+k
+B
+B
+B
+B
+w
+C
+"}
+(8,1,1) = {"
+a
+w
+l
+v
+E
+B
+o
+B
+N
+k
+B
+B
+B
+B
+o
+C
+"}
+(9,1,1) = {"
+a
+w
+M
+Y
+c
+B
+w
+B
+N
+k
+B
+B
+B
+B
+w
+C
+"}
+(10,1,1) = {"
+a
+w
+B
+B
+B
+B
+w
+B
+I
+k
+B
+B
+B
+B
+w
+a
+"}
+(11,1,1) = {"
+a
+w
+w
+w
+w
+w
+w
+B
+B
+B
+K
+K
+K
+s
+w
+a
+"}
+(12,1,1) = {"
+a
+a
+w
+f
+g
+B
+B
+B
+B
+B
+K
+K
+K
+f
+w
+a
+"}
+(13,1,1) = {"
+a
+a
+w
+L
+B
+W
+N
+N
+g
+B
+K
+K
+K
+L
+w
+a
+"}
+(14,1,1) = {"
+a
+a
+w
+w
+B
+W
+m
+N
+g
+B
+W
+u
+g
+w
+w
+a
+"}
+(15,1,1) = {"
+a
+a
+a
+w
+w
+w
+w
+w
+w
+w
+w
+w
+w
+w
+a
+a
+"}
+(16,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/maps/southern_cross/southern_cross-2.dmm b/maps/southern_cross/southern_cross-2.dmm
index bffc320d94..85fbcdf8dd 100644
--- a/maps/southern_cross/southern_cross-2.dmm
+++ b/maps/southern_cross/southern_cross-2.dmm
@@ -5717,7 +5717,7 @@
"guC" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = null; icon_state = "door_locked"; id_tag = null; locked = 1; name = "Dock Three External Airlock"; req_access = list(13)},/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"gvF" = (/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/medical/patient_wing)
"gwp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/cafeteria)
-"gyw" = (/obj/structure/bed/chair/sofa/blue/left{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/vending/wallmed1{pixel_y = -30},/turf/simulated/floor/tiled,/area/medical/medbay2)
+"gyw" = (/obj/structure/bed/chair/sofa/left/blue{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/vending/wallmed1{pixel_y = -30},/turf/simulated/floor/tiled,/area/medical/medbay2)
"gyA" = (/obj/machinery/cryopod{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/cryo/station)
"gyT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/computer/timeclock/premade/south,/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/dockhallway)
"gzN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 28},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
@@ -5856,7 +5856,7 @@
"hTs" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/wall,/area/library)
"hTx" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; id_tag = null},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/effect/map_helper/airlock/atmos/chamber_pump,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"hUh" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"hUM" = (/obj/structure/bed/chair/sofa/brown/right{dir = 8},/turf/simulated/floor/carpet/oracarpet,/area/library)
+"hUM" = (/obj/structure/bed/chair/sofa/right/brown{dir = 8},/turf/simulated/floor/carpet/oracarpet,/area/library)
"hUO" = (/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/seconddeck/gym)
"hVh" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/bar)
"hVH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/medbay)
@@ -6020,7 +6020,7 @@
"jRr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/multi_tile/glass{name = "Central Access"},/obj/machinery/door/firedoor/multi_tile/glass,/turf/simulated/floor/tiled/steel_grid,/area/hallway/secondary/docking_hallway2)
"jRW" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
"jSi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"jSR" = (/obj/structure/bed/chair/sofa/blue/corner{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/item/device/radio/intercom/department/medbay{dir = 8; pixel_x = -21},/turf/simulated/floor/tiled,/area/medical/medbay2)
+"jSR" = (/obj/structure/bed/chair/sofa/corner/blue{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/item/device/radio/intercom/department/medbay{dir = 8; pixel_x = -21},/turf/simulated/floor/tiled,/area/medical/medbay2)
"jUw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/cargo)
"jUx" = (/obj/machinery/smartfridge/drinks,/obj/machinery/light{dir = 1},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"jVL" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay)
@@ -6046,7 +6046,7 @@
"khA" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 5},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/ward)
"khW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/cargo)
"kjb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/medbay2)
-"kjR" = (/obj/structure/bed/chair/sofa/blue/left{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "screen"; pixel_x = -32},/turf/simulated/floor/tiled,/area/medical/medbay2)
+"kjR" = (/obj/structure/bed/chair/sofa/left/blue{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "screen"; pixel_x = -32},/turf/simulated/floor/tiled,/area/medical/medbay2)
"klh" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hallway/primary/seconddeck/ascenter)
"klK" = (/obj/item/toy/eight_ball,/obj/structure/table/bench/glass,/turf/simulated/floor/carpet/sblucarpet,/area/medical/medbay2)
"kmj" = (/obj/structure/table/glass,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/docking_hallway2)
@@ -6230,7 +6230,7 @@
"mgk" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/structure/curtain/open/privacy,/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/medical/ward)
"mgO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/library)
"mif" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"mij" = (/obj/structure/bed/chair/sofa/brown/left{dir = 8},/turf/simulated/floor/carpet/oracarpet,/area/library)
+"mij" = (/obj/structure/bed/chair/sofa/left/brown{dir = 8},/turf/simulated/floor/carpet/oracarpet,/area/library)
"miQ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "crg_aft_pump"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor,/area/maintenance/cargo)
"miS" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume,/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/airlock_sensor{dir = 1; frequency = 1380; id_tag = "escape_dock_north_sensor"; pixel_y = -27},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/effect/map_helper/airlock/sensor/chamber_sensor,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"mlF" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office)
diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm
index 0033f3e547..a51b271ab6 100644
--- a/maps/southern_cross/southern_cross-3.dmm
+++ b/maps/southern_cross/southern_cross-3.dmm
@@ -2047,7 +2047,7 @@
"uEW" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/solars/foreportsolar)
"uFi" = (/obj/machinery/computer/power_monitor{dir = 1},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled/dark,/area/bridge)
"uFJ" = (/obj/structure/ladder,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
-"uFP" = (/obj/structure/table/rack/shelf/steel,/obj/item/weapon/grenade/confetti/party_ball,/obj/item/weapon/grenade/confetti/party_ball,/obj/item/weapon/grenade/confetti/party_ball,/obj/item/toy/crossbow,/obj/item/toy/eight_ball,/obj/item/toy/figure,/obj/item/toy/figure,/obj/item/toy/snappop,/obj/item/toy/snappop,/obj/item/toy/snappop,/turf/simulated/floor/plating,/area/maintenance/thirddeck/dormsaft{name = "Third Deck Aft Maintenance"})
+"uFP" = (/obj/structure/table/rack/shelf/steel,/obj/item/weapon/grenade/confetti/party_ball,/obj/item/weapon/grenade/confetti/party_ball,/obj/item/weapon/grenade/confetti/party_ball,/obj/item/weapon/gun/projectile/revolver/toy/crossbow,/obj/item/toy/eight_ball,/obj/item/toy/figure,/obj/item/toy/figure,/obj/item/toy/snappop,/obj/item/toy/snappop,/obj/item/toy/snappop,/turf/simulated/floor/plating,/area/maintenance/thirddeck/dormsaft{name = "Third Deck Aft Maintenance"})
"uGK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/aftportcentral)
"uIm" = (/turf/simulated/floor/wood,/area/bridge/meeting_room)
"uIt" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/structure/closet/medical_wall{pixel_y = 31},/obj/item/roller,/obj/item/bodybag/cryobag,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/spaceacillin,/turf/simulated/floor/tiled,/area/bridge)
diff --git a/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm b/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm
index 6d6cc6cdbb..785dc57cc6 100644
--- a/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm
+++ b/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm
@@ -15,10 +15,10 @@
"u" = (/obj/structure/table/gamblingtable,/obj/machinery/light/poi{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"v" = (/obj/structure/table/fancyblack,/obj/item/clothing/mask/smokable/cigarette/cigar,/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
"w" = (/turf/simulated/wall/wood,/area/submap/Speakeasy)
-"x" = (/obj/structure/bed/chair/sofa/blue/left{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
+"x" = (/obj/structure/bed/chair/sofa/left/blue{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"B" = (/turf/simulated/floor/wood,/area/submap/Speakeasy)
"C" = (/turf/simulated/mineral/floor/cave,/area/submap/Speakeasy)
-"D" = (/obj/structure/bed/chair/sofa/black/corner{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
+"D" = (/obj/structure/bed/chair/sofa/corner/black{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"E" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
"H" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/wood,/area/submap/Speakeasy)
"I" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/turf/simulated/floor/wood,/area/submap/Speakeasy)
@@ -28,7 +28,7 @@
"N" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/submap/Speakeasy)
"O" = (/obj/machinery/light/poi{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"R" = (/obj/structure/bed/chair/sofa/black{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"U" = (/obj/structure/bed/chair/sofa/blue/right{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
+"U" = (/obj/structure/bed/chair/sofa/right/blue{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"V" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"W" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/wood,/area/submap/Speakeasy)
"X" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/floor/wood,/area/submap/Speakeasy)
diff --git a/maps/submaps/surface_submaps/wilderness/emptycabin.dmm b/maps/submaps/surface_submaps/wilderness/emptycabin.dmm
index 69161ff9f3..5c6c91f093 100644
--- a/maps/submaps/surface_submaps/wilderness/emptycabin.dmm
+++ b/maps/submaps/surface_submaps/wilderness/emptycabin.dmm
@@ -5,7 +5,7 @@
"e" = (/turf/simulated/wall/sifwood,/area/submap/EmptyCabin)
"f" = (/obj/structure/railing/grey{dir = 1},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"g" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/purpledouble,/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
-"i" = (/obj/structure/bed/chair/sofa/blue/right{dir = 1},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
+"i" = (/obj/structure/bed/chair/sofa/right/blue{dir = 1},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"k" = (/obj/structure/railing/grey{dir = 8},/obj/structure/bed/chair/oldsofa/right{dir = 8},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"l" = (/obj/structure/railing/grey{dir = 8},/obj/structure/bed/chair/oldsofa{dir = 8},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"n" = (/obj/structure/table/sifwoodentable,/obj/item/weapon/storage/fancy/candle_box,/obj/item/weapon/paper/crumpled/bloody{info = "I found an otie while picking flowers today. He's so cute! I took him back home, and he seemed quite happy to share food with me. He really likes fish. Though, he never really seems to not be hungry..."},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
@@ -21,7 +21,7 @@
"F" = (/mob/living/simple_mob/otie/friendly/chubby{desc = "The classic bioengineered longdog. This one still probably won't tolerate you. What an absolute unit"; faction = "spiders"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"G" = (/obj/structure/bed/chair/sofa/blue{dir = 1},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"I" = (/obj/structure/table/sifwoodentable,/obj/item/pizzabox/meat,/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
-"J" = (/obj/structure/bed/chair/sofa/blue/left{dir = 1},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
+"J" = (/obj/structure/bed/chair/sofa/left/blue{dir = 1},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"L" = (/obj/structure/table/sifwoodentable,/obj/item/weapon/flame/candle/candelabra,/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"M" = (/obj/item/weapon/bone/leg,/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
"O" = (/obj/structure/railing/grey{dir = 8},/obj/structure/bed/chair/oldsofa/left{dir = 8},/turf/simulated/floor/wood/sif,/area/submap/EmptyCabin)
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index 8e7071e0a9..a2ff134694 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -33527,7 +33527,7 @@
"gWO" = (
/obj/structure/table/rack,
/obj/effect/floor_decal/rust,
-/obj/item/toy/crossbow,
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow,
/turf/simulated/floor/plating,
/area/tether/surfacebase/funny/hideyhole)
"gYx" = (
@@ -36697,8 +36697,8 @@
/area/maintenance/lower/trash_pit)
"qhs" = (
/obj/structure/table/rack,
-/obj/item/toy/crossbow,
/obj/item/weapon/coin/silver,
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow,
/turf/simulated/floor/plating,
/area/tether/surfacebase/funny/hideyhole)
"qjE" = (
diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm
index 0410563590..08c1b307a3 100644
--- a/maps/tether/tether-03-surface3.dmm
+++ b/maps/tether/tether-03-surface3.dmm
@@ -32593,7 +32593,6 @@
/obj/item/weapon/soap/nanotrasen,
/obj/item/weapon/soap/deluxe,
/obj/item/weapon/staff/gentcane,
-/obj/item/toy/crossbow,
/obj/item/toy/eight_ball/conch,
/obj/item/weapon/cell/potato,
/obj/structure/cable/green{
@@ -32602,6 +32601,11 @@
icon_state = "1-2"
},
/obj/item/device/megaphone,
+<<<<<<< HEAD
+=======
+/obj/random/cutout,
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow,
+>>>>>>> 1432ca2b223... Merge pull request #12253 from GhostActual/Donk-Co.-Toys
/turf/simulated/floor/lino,
/area/tether/surfacebase/entertainment/backstage)
"bcV" = (
diff --git a/sound/items/sonic_driver.ogg b/sound/items/sonic_driver.ogg
new file mode 100644
index 0000000000..d02a2b6709
Binary files /dev/null and b/sound/items/sonic_driver.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 805d696176..59e31457a5 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3751,6 +3751,7 @@
#include "code\modules\projectiles\gun_ch.dm"
#include "code\modules\projectiles\projectile.dm"
#include "code\modules\projectiles\projectile_ch.dm"
+#include "code\modules\projectiles\ammunition\ammo_boxes.dm"
#include "code\modules\projectiles\ammunition\magazines.dm"
#include "code\modules\projectiles\ammunition\magazines_vr.dm"
#include "code\modules\projectiles\ammunition\magazines_yw.dm"
@@ -3772,6 +3773,7 @@
#include "code\modules\projectiles\guns\modular_guns.dm"
#include "code\modules\projectiles\guns\projectile.dm"
#include "code\modules\projectiles\guns\projectile_ch.dm"
+#include "code\modules\projectiles\guns\toy.dm"
#include "code\modules\projectiles\guns\vox.dm"
#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm"
#include "code\modules\projectiles\guns\energy\crestrose_vr.dm"
@@ -4303,6 +4305,7 @@
#include "code\modules\xenoarcheaology\anomaly_container.dm"
#include "code\modules\xenoarcheaology\boulder.dm"
#include "code\modules\xenoarcheaology\effect.dm"
+#include "code\modules\xenoarcheaology\effect_master.dm"
#include "code\modules\xenoarcheaology\manuals.dm"
#include "code\modules\xenoarcheaology\misc.dm"
#include "code\modules\xenoarcheaology\sampling.dm"