diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 19b41ef8018f..0f8565b7ecec 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3045,11 +3045,6 @@ /area/wizard_station) "aEX" = ( /obj/structure/table/wood, -/obj/item/gun/magic/wand{ - desc = "Used in emergencies to reignite magma engines."; - max_charges = 0; - name = "wand of emergency engine ignition" - }, /turf/open/floor/plasteel, /area/wizard_station) "aEY" = ( diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 30bcd4e253c8..8b05ccacd1fe 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -31,7 +31,6 @@ #define GLOWY /datum/mutation/human/glow #define ANTIGLOWY /datum/mutation/human/glow/anti #define TELEPATHY /datum/mutation/human/telepathy -#define FIREBREATH /datum/mutation/human/firebreath #define VOID /datum/mutation/human/void #define TONGUESPIKE /datum/mutation/human/tonguespike #define TONGUESPIKECHEM /datum/mutation/human/tongue_spike/chem diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index e5683140933f..ad0754c85b21 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -133,53 +133,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) #define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE) #define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE) -//Gun weapon weight -/// Allows you to dual wield this gun and your offhand gun -#define WEAPON_LIGHT 1 -/// Does not allow you to dual wield with this gun and your offhand gun -#define WEAPON_MEDIUM 2 -/// You must wield the gun to fire this gun -#define WEAPON_HEAVY 3 -/// You must FULLY wield (wait the full wield delay) the gun to fire this gun -#define WEAPON_VERY_HEAVY 4 -//Gun trigger guards -#define TRIGGER_GUARD_ALLOW_ALL -1 -#define TRIGGER_GUARD_NONE 0 -#define TRIGGER_GUARD_NORMAL 1 -//Gun bolt types -///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever -#define BOLT_TYPE_STANDARD 1 -///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. -/// Example: Some SMGs, the L6 -#define BOLT_TYPE_OPEN 2 -///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. -/// Example: Break action shotguns, revolvers -#define BOLT_TYPE_NO_BOLT 3 -///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. -/// Example: Pistols with a slide lock, some SMGs -#define BOLT_TYPE_LOCKING 4 -//Sawn off nerfs -///accuracy penalty of sawn off guns -#define SAWN_OFF_ACC_PENALTY 25 -///added recoil of sawn off guns -#define SAWN_OFF_RECOIL 1 - -//ammo box sprite defines -///ammo box will always use provided icon state -#define AMMO_BOX_ONE_SPRITE 0 -///ammo box will have a different state for each bullet; - -#define AMMO_BOX_PER_BULLET 1 -///ammo box will have a different state for full and empty; -max_ammo and -0 -#define AMMO_BOX_FULL_EMPTY 2 - -#define SUPPRESSED_NONE 0 -#define SUPPRESSED_QUIET 1 ///standard suppressed -#define SUPPRESSED_VERY 2 /// no message - -//Projectile Reflect -#define REFLECT_NORMAL (1<<0) -#define REFLECT_FAKEPROJECTILE (1<<1) - //Object/Item sharpness #define IS_BLUNT 0 #define IS_SHARP 1 @@ -215,23 +168,3 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.1 - -//bullet_act() return values -#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. - -#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle - -//Autofire component -/// Compatible firemode is in the gun. Wait until it's held in the user hands. -#define AUTOFIRE_STAT_IDLE (1<<0) -/// Gun is active and in the user hands. Wait until user does a valid click. -#define AUTOFIRE_STAT_ALERT (1<<1) -/// Gun is shooting. -#define AUTOFIRE_STAT_FIRING (1<<2) - -#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown" - #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0) -#define COMSIG_AUTOFIRE_SHOT "autofire_shot" - #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 556a9ff0e35c..dba7ce93afaf 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -1,4 +1,61 @@ -//weapon manufacturers +//Gun weapon weight +/// Allows you to dual wield this gun and your offhand gun +#define WEAPON_LIGHT 1 +/// Does not allow you to dual wield with this gun and your offhand gun +#define WEAPON_MEDIUM 2 +/// You must wield the gun to fire this gun +#define WEAPON_HEAVY 3 +/// You must FULLY wield (wait the full wield delay) the gun to fire this gun +#define WEAPON_VERY_HEAVY 4 +//Gun trigger guards +#define TRIGGER_GUARD_ALLOW_ALL -1 +#define TRIGGER_GUARD_NONE 0 +#define TRIGGER_GUARD_NORMAL 1 +//Gun bolt types +///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever +#define BOLT_TYPE_STANDARD 1 +///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. +/// Example: Some SMGs, the L6 +#define BOLT_TYPE_OPEN 2 +///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. +/// Example: Break action shotguns, revolvers +#define BOLT_TYPE_NO_BOLT 3 +///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. +/// Example: Pistols with a slide lock, some SMGs +#define BOLT_TYPE_LOCKING 4 +//Sawn off nerfs +///accuracy penalty of sawn off guns +#define SAWN_OFF_ACC_PENALTY 25 +///added recoil of sawn off guns +#define SAWN_OFF_RECOIL 1 + +//ammo box sprite defines +///ammo box will always use provided icon state +#define AMMO_BOX_ONE_SPRITE 0 +///ammo box will have a different state for each bullet; - +#define AMMO_BOX_PER_BULLET 1 +///ammo box will have a different state for full and empty; -max_ammo and -0 +#define AMMO_BOX_FULL_EMPTY 2 + +#define SUPPRESSED_NONE 0 +#define SUPPRESSED_QUIET 1 ///standard suppressed +#define SUPPRESSED_VERY 2 /// no message + +//Autofire component +/// Compatible firemode is in the gun. Wait until it's held in the user hands. +#define AUTOFIRE_STAT_IDLE (1<<0) +/// Gun is active and in the user hands. Wait until user does a valid click. +#define AUTOFIRE_STAT_ALERT (1<<1) +/// Gun is shooting. +#define AUTOFIRE_STAT_FIRING (1<<2) + +#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown" + #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0) +#define COMSIG_AUTOFIRE_SHOT "autofire_shot" + #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) + +#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 + #define MANUFACTURER_NONE null #define MANUFACTURER_SHARPLITE "the Sharplite Defense logo" #define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo" @@ -15,6 +72,25 @@ #define MANUFACTURER_PGF "the Etherbor Industries emblem" #define MANUFACTURER_IMPORT "Lanchester Import Co." + +///////////////// +// PROJECTILES // +///////////////// + +//bullet_act() return values +#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. + +#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle + +//Projectile Reflect +#define REFLECT_NORMAL (1<<0) +#define REFLECT_FAKEPROJECTILE (1<<1) + +#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. +#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. + #define FIREMODE_SEMIAUTO "single" #define FIREMODE_BURST "burst" #define FIREMODE_FULLAUTO "auto" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 8cd775c06f77..64aa6aa52627 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -174,5 +174,4 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( /obj/item/tank/internals/plasmaman, /obj/item/toy))) -//WS Port - Internals checker #define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask) diff --git a/code/__DEFINES/species_clothing_defines.dm b/code/__DEFINES/species_clothing_defines.dm index c74a20877348..517579192634 100644 --- a/code/__DEFINES/species_clothing_defines.dm +++ b/code/__DEFINES/species_clothing_defines.dm @@ -31,12 +31,12 @@ #define KEPORI_UNIFORM_PATH 'icons/mob/species/kepori/onmob_uniform_kepori.dmi' #define KEPORI_SHOES_PATH 'icons/mob/species/kepori/onmob_feet_kepori.dmi' #define KEPORI_SUIT_PATH 'icons/mob/species/kepori/onmob_suit_kepori.dmi' -//#define KEPORI_EARS_PATH 'icons/mob/species/kepori/onmob_ears_kepori.dmi' +#define KEPORI_EARS_PATH 'icons/mob/species/kepori/onmob_ears_kepori.dmi' #define KEPORI_MASK_PATH 'icons/mob/species/kepori/onmob_mask_kepori.dmi' #define KEPORI_HEAD_PATH 'icons/mob/species/kepori/onmob_head_kepori.dmi' +#define KEPORI_GLASSES_PATH 'icons/mob/species/kepori/onmob_eyes_kepori.dmi' #define KEPORI_GLOVES_PATH 'icons/mob/species/kepori/onmob_hands_kepori.dmi' -//#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi' -//#define KEPORI_GLASSES_PATH 'icons/mob/species/kepori/onmob_eyes_kepori.dmi' -#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi' -#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi' -#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi' +#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi' +#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi' +#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi' +#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi' diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index e44755574eea..5eb2686b2118 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -42,6 +42,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_spinneret, GLOB.spider_spinneret_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_feathers, GLOB.kepori_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_body_feathers, GLOB.kepori_body_feathers_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_head_feathers, GLOB.kepori_head_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_tail_feathers, GLOB.kepori_tail_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_head_quills, GLOB.vox_head_quills_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_neck_quills, GLOB.vox_neck_quills_list) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 63990e61ee33..6a3028443dcc 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -108,6 +108,7 @@ "ipc_chassis" = pick(GLOB.ipc_chassis_list), "ipc_screen" = pick(GLOB.ipc_screens_list), "kepori_body_feathers" = pick(GLOB.kepori_body_feathers_list), + "kepori_head_feathers" = pick(GLOB.kepori_head_feathers_list), "kepori_feathers" = pick(GLOB.kepori_feathers_list), "kepori_tail_feathers" = pick(GLOB.kepori_tail_feathers_list), "legs" = "Normal Legs", diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index f4f000be6d57..f9edbc500142 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -46,6 +46,7 @@ GLOBAL_LIST_EMPTY(spider_legs_list) GLOBAL_LIST_EMPTY(spider_spinneret_list) GLOBAL_LIST_EMPTY(kepori_feathers_list) GLOBAL_LIST_EMPTY(kepori_body_feathers_list) +GLOBAL_LIST_EMPTY(kepori_head_feathers_list) GLOBAL_LIST_EMPTY(kepori_tail_feathers_list) GLOBAL_LIST_EMPTY(vox_head_quills_list) GLOBAL_LIST_EMPTY(vox_neck_quills_list) diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 3dc5553b7381..25ae750eb0d3 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -132,7 +132,6 @@ SUBSYSTEM_DEF(traumas) /obj/item/soulstone, /obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff, /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard, - /obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)), "aliens" = typecacheof(list( diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index ec1ee58735f9..8cabee42d21c 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -131,11 +131,7 @@ /obj/projectile/bullet/honker = 15, /obj/projectile/temp = 15, /obj/projectile/ion = 15, - /obj/projectile/magic/door = 15, - /obj/projectile/magic/locker = 15, - /obj/projectile/magic/fetch = 15, /obj/projectile/beam/emitter = 15, - /obj/projectile/magic/flying = 15, /obj/projectile/energy/net = 15, /obj/projectile/bullet/incendiary/c9mm = 15, /obj/projectile/temp/hot = 15, diff --git a/code/datums/dna.dm b/code/datums/dna.dm index dde90dd5dbe8..abd20fd29212 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -659,8 +659,6 @@ O.Remove(src) visible_message("[src] vomits up their [O.name]!", "You vomit up your [O.name]") //no "vomit up your the heart" O.forceMove(drop_location()) - if(prob(20)) - O.animate_atom_living() if(9 to 10) ForceContractDisease(new/datum/disease/gastrolosis()) to_chat(src, "Oh, I actually feel quite alright!") diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index f2ffe7c25fd2..53080247b827 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -88,67 +88,6 @@ if(direction_text) to_chat(user,"You consider [tracking_target]'s scent. The trail leads [direction_text].") -/datum/mutation/human/firebreath - name = "Fire Breath" - desc = "An ancient mutation that gives lizards breath of fire." - quality = POSITIVE - difficulty = 12 - locked = TRUE - text_gain_indication = "Your throat is burning!" - text_lose_indication = "Your throat is cooling down." - power = /obj/effect/proc_holder/spell/aimed/firebreath - instability = 30 - energy_coeff = 1 - power_coeff = 1 - -/datum/mutation/human/firebreath/modify() - if(power) - var/obj/effect/proc_holder/spell/aimed/firebreath/S = power - S.strength = GET_MUTATION_POWER(src) - -/obj/effect/proc_holder/spell/aimed/firebreath - name = "Fire Breath" - desc = "You can breathe fire at a target." - school = "evocation" - charge_max = 600 - clothes_req = FALSE - range = 20 - projectile_type = /obj/projectile/magic/aoe/fireball/firebreath - base_icon_state = "fireball" - action_icon_state = "fireball0" - sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises - active_msg = "You built up heat in your mouth." - deactive_msg = "You swallow the flame." - var/strength = 1 - -/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets) - . = ..() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(C.is_mouth_covered()) - C.adjust_fire_stacks(2) - C.IgniteMob() - to_chat(C,"Something in front of your mouth caught fire!") - return FALSE - -/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - if(!istype(P, /obj/projectile/magic/aoe/fireball)) - return - var/obj/projectile/magic/aoe/fireball/F = P - switch(strength) - if(1 to 3) - F.exp_light = strength-1 - if(4 to INFINITY) - F.exp_heavy = strength-3 - F.exp_fire += strength - -/obj/projectile/magic/aoe/fireball/firebreath - name = "fire breath" - exp_heavy = 0 - exp_light = 0 - exp_flash = 0 - exp_fire= 4 - /datum/mutation/human/void name = "Void Magnet" desc = "A rare genome that attracts odd forces not usually observed." diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 82735ff9d522..65e161f2176b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -883,31 +883,6 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Steal at least five guns!" wanted_items = list(/obj/item/gun) -/datum/objective/steal_five_of_type/summon_magic - name = "steal magic" - explanation_text = "Steal at least five magical artefacts!" - wanted_items = list() - -/datum/objective/steal_five_of_type/summon_magic/New() - wanted_items = GLOB.summoned_magic_objectives - ..() - -/datum/objective/steal_five_of_type/summon_magic/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(istype(I, /obj/item/book/granter/spell)) - var/obj/item/book/granter/spell/spellbook = I - if(!spellbook.used || !spellbook.oneuse) //if the book still has powers... - stolen_count++ //it counts. nice. - else if(is_type_in_typecache(I, wanted_items)) - stolen_count++ - return stolen_count >= 5 - //Created by admin tools /datum/objective/custom name = "custom" diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 1f78839ae40f..a11539595805 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -90,11 +90,6 @@ desc = "This will make you big and strong, but give you a bad skin condition." add_mutations = list(HULK) -/obj/item/dnainjector/firebreath - name = "\improper DNA injector (Fire Breath)" - desc = "Restores the dragon ancestry." - add_mutations = list(FIREBREATH) - /obj/item/dnainjector/xraymut name = "\improper DNA injector (X-ray)" desc = "Finally you can see what the Captain does." diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 0681892fd47e..f3cdfb068944 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -247,19 +247,6 @@ user.Stun(40, ignore_canstun = TRUE) user.petrify(30) -/obj/item/book/granter/spell/cards - spell = /obj/effect/proc_holder/spell/aimed/spell_cards - spellname = "spellcards" - icon_state ="bookspellcards" - desc = "The ultimate card trick, for users ten and up." - remarks = list("It's all about the razzmataz.", "...I don't think I'll actually be sawing anyone in half", "These are pretty flimsy, most armor would defeat them.", "They do burn damage? Weird.", "Why the dumb stance? It's just a flick of the hand...", "Are these cards? They feel stiffer then pages.", "Best performed using a top hat...") - -/obj/item/book/granter/spell/cards/recoil(mob/living/user) - ..() - to_chat(user,"The cards are against you!") - user.Stun(40, ignore_canstun = TRUE) - user.petrify(30) - /obj/item/book/granter/spell/shapechange spell = /obj/effect/proc_holder/spell/targeted/shapeshift spellname = "shapechange" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index f8bb97d3a411..5d87b42b78e5 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -226,7 +226,7 @@ /obj/item/storage/backpack/satchel/leather name = "leather satchel" desc = "It's a very fancy satchel made with fine leather." - icon = 'icons/obj/storage.dmi' //WS Edit - Suitcases + icon = 'icons/obj/storage.dmi' icon_state = "satchel" item_state = "satchel" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 5e23e11b3438..802eeee2d45f 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -610,33 +610,6 @@ /obj/item/multitool = 1) generate_items_inside(items_inside,src) - -/obj/item/storage/belt/wands - name = "wand belt" - desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic." - icon_state = "soulstone" - item_state = "soulstone" - -/obj/item/storage/belt/wands/ComponentInitialize() - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 6 - STR.set_holdable(list( - /obj/item/gun/magic/wand - )) - -/obj/item/storage/belt/wands/full/PopulateContents() - new /obj/item/gun/magic/wand/death(src) - new /obj/item/gun/magic/wand/resurrection(src) - new /obj/item/gun/magic/wand/polymorph(src) - new /obj/item/gun/magic/wand/teleport(src) - new /obj/item/gun/magic/wand/door(src) - new /obj/item/gun/magic/wand/fireball(src) - - for(var/obj/item/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition - W.max_charges = initial(W.max_charges) - W.charges = W.max_charges - /obj/item/storage/belt/janitor name = "janibelt" desc = "A belt used to hold most janitorial supplies." diff --git a/code/game/objects/structures/fugitive_role_spawners.dm b/code/game/objects/structures/fugitive_role_spawners.dm deleted file mode 100644 index 4f98e919ffc5..000000000000 --- a/code/game/objects/structures/fugitive_role_spawners.dm +++ /dev/null @@ -1,58 +0,0 @@ - - -/obj/effect/mob_spawn/human/fugitive - assignedrole = "Fugitive Hunter" - flavour_text = "" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details - roundstart = FALSE - death = FALSE - random = TRUE - show_flavour = FALSE - density = TRUE - var/back_story = "error" - -/obj/effect/mob_spawn/human/fugitive/Initialize(mapload) - . = ..() - notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE) - -/obj/effect/mob_spawn/human/fugitive/spacepol - name = "police pod" - desc = "A small sleeper typically used to put people to sleep for briefing on the mission." - mob_name = "a spacepol officer" - flavour_text = "Justice has arrived. I am a member of the Spacepol!" - back_story = "space cop" - outfit = /datum/outfit/spacepol - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/russian - name = "russian pod" - flavour_text = "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!" - back_story = "russian" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - mob_name = "russian" - outfit = /datum/outfit/frontier/hunter - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/bounty - name = "bounty hunter pod" - flavour_text = "We got a new bounty on some fugitives, dead or alive." - back_story = "bounty hunters" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - mob_name = "bounty hunter" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/bounty/Destroy() - var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) - S.setDir(dir) - return ..() - -/obj/effect/mob_spawn/human/fugitive/bounty/armor - outfit = /datum/outfit/bountyarmor - -/obj/effect/mob_spawn/human/fugitive/bounty/hook - outfit = /datum/outfit/bountyhook - -/obj/effect/mob_spawn/human/fugitive/bounty/synth - outfit = /datum/outfit/bountysynth diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 2a7a8c5f4a38..47ac972b1c20 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -743,7 +743,6 @@ GLOBAL_LIST_INIT(ore_probability, list( new /obj/item/clothing/suit/space/hardsuit/carp(loc) new /mob/living/simple_animal/hostile/carp(loc) if(prob(45)) - new /obj/item/gun/magic/hook(loc) new /mob/living/simple_animal/hostile/carp(loc) if(prob(45)) new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc) @@ -1045,7 +1044,6 @@ GLOBAL_LIST_INIT(ore_probability, list( if(prob(45)) new /obj/item/dnainjector/dwarf(loc) if(prob(35)) - new /obj/item/dnainjector/firebreath(loc) new /mob/living/simple_animal/hostile/gorilla(loc) if(prob(35)) new /mob/living/simple_animal/hostile/gorilla(loc) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 7d5dfccf2804..3b8c5191c9b6 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -42,6 +42,7 @@ H.dna.features["squid_face"] = pick(GLOB.squid_face_list) H.dna.features["kepori_feathers"] = pick(GLOB.kepori_feathers_list) H.dna.features["kepori_body_feathers"] = pick(GLOB.kepori_body_feathers_list) + H.dna.features["kepori_head_feathers"] = pick(GLOB.kepori_head_feathers_list) H.dna.features["vox_head_quills"] = pick(GLOB.vox_head_quills_list) H.dna.features["vox_neck_quills"] = pick(GLOB.vox_neck_quills_list) H.dna.features["elzu_horns"] = pick(GLOB.elzu_horns_list) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index df5b1d6d18d3..f189fdf6106d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -735,8 +735,6 @@ M.audible_message("...wabbajack...wabbajack...") playsound(M.loc, 'sound/magic/staff_change.ogg', 50, TRUE, -1) - wabbajack(M) - message_admins("Mass polymorph started by [who_did_it] is complete.") diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 68e0d514ad3a..28a4ae06d16b 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -211,185 +211,6 @@ if(can_drop) new /obj/item/melee/synthetic_arm_blade(get_turf(user)) -/***************************************\ -|***********COMBAT TENTACLES*************| -\***************************************/ - -/datum/action/changeling/weapon/tentacle - name = "Tentacle" - desc = "We ready a tentacle to grab items or victims with. Costs 10 chemicals." - helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \ - Help will simply drag them closer, Disarm will grab whatever they're holding instead of them, Grab will put the victim in our hold after catching it, \ - and Harm will pull it in and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form." - button_icon_state = "tentacle" - chemical_cost = 10 - dna_cost = 2 - req_human = 1 - weapon_type = /obj/item/gun/magic/tentacle - weapon_name_simple = "tentacle" - silent = TRUE - -/obj/item/gun/magic/tentacle - name = "tentacle" - desc = "A fleshy tentacle that can stretch out and grab things or people." - icon = 'icons/obj/changeling_items.dmi' - icon_state = "tentacle" - item_state = "tentacle" - lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON - flags_1 = NONE - w_class = WEIGHT_CLASS_HUGE - slot_flags = NONE - ammo_type = /obj/item/ammo_casing/magic/tentacle - fire_sound = 'sound/effects/splat.ogg' - force = 0 - max_charges = 1 - fire_delay = 0.1 SECONDS - throwforce = 0 //Just to be on the safe side - throw_range = 0 - throw_speed = 0 - -/obj/item/gun/magic/tentacle/Initialize(mapload, silent) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - if(ismob(loc)) - if(!silent) - loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") - else - to_chat(loc, "You prepare to extend a tentacle.") - - -/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] is not ready yet.") - -/obj/item/gun/magic/tentacle/process_fire() - . = ..() - if(charges == 0) - qdel(src) - -/obj/item/ammo_casing/magic/tentacle - name = "tentacle" - desc = "A tentacle." - projectile_type = /obj/projectile/tentacle - caliber = "tentacle" - icon_state = "arrow" - firing_effect_type = null - var/obj/item/gun/magic/tentacle/gun //the item that shot it - -/obj/item/ammo_casing/magic/tentacle/Initialize() - gun = loc - . = ..() - -/obj/item/ammo_casing/magic/tentacle/Destroy() - gun = null - return ..() - -/obj/projectile/tentacle - name = "tentacle" - icon_state = "tentacle_end" - pass_flags = PASSTABLE - damage = 0 - damage_type = BRUTE - range = 8 - hitsound = 'sound/weapons/thudswoosh.ogg' - var/chain - var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it - -/obj/projectile/tentacle/Initialize() - source = loc - . = ..() - -/obj/projectile/tentacle/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE) - ..() - -/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) - if(H.throw_mode) - H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item - -/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C) - if(H.Adjacent(C)) - if(H.get_active_held_item() && !H.get_inactive_held_item()) - H.swap_hand() - if(H.get_active_held_item()) - return - C.grabbedby(H) - C.grippedby(H, instant = TRUE) //instant aggro grab - -/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) - if(H.Adjacent(C)) - for(var/obj/item/I in H.held_items) - if(I.get_sharpness()) - C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!") - C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST) - H.do_item_attack_animation(C, used_item = I) - H.add_mob_blood(C) - playsound(get_turf(H),I.hitsound,75,TRUE) - return - -/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) - var/mob/living/carbon/human/H = firer - if(blocked >= 100) - return BULLET_ACT_BLOCK - if(isitem(target)) - var/obj/item/I = target - if(!I.anchored) - to_chat(firer, "You pull [I] towards yourself.") - H.throw_mode_on() - I.throw_at(H, 10, 2) - . = BULLET_ACT_HIT - - else if(isliving(target)) - var/mob/living/L = target - if(!L.anchored && !L.throwing)//avoid double hits - if(iscarbon(L)) - var/mob/living/carbon/C = L - var/firer_intent = INTENT_HARM - var/mob/M = firer - if(istype(M)) - firer_intent = M.a_intent - switch(firer_intent) - if(INTENT_HELP) - C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2) - return BULLET_ACT_HIT - - if(INTENT_DISARM) - var/obj/item/I = C.get_active_held_item() - if(I) - if(C.dropItemToGround(I)) - C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") - on_hit(I) //grab the item as if you had hit it directly with the tentacle - return BULLET_ACT_HIT - else - to_chat(firer, "You can't seem to pry [I] off [C]'s hands!") - return BULLET_ACT_BLOCK - else - to_chat(firer, "[C] has nothing in hand to disarm!") - return BULLET_ACT_HIT - - if(INTENT_GRAB) - C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C)) - return BULLET_ACT_HIT - - if(INTENT_HARM) - C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C)) - return BULLET_ACT_HIT - else - L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - L.throw_at(get_step_towards(H,L), 8, 2) - . = BULLET_ACT_HIT - -/obj/projectile/tentacle/Destroy() - qdel(chain) - source = null - return ..() - - /***************************************\ |****************SHIELD*****************| \***************************************/ diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index cf1562d8c289..c9232857a547 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -812,7 +812,7 @@ /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) if(iscultist(user)) - var/list/options = list("Blood Spear (150)", "Blood Bolt Barrage (300)", "Blood Beam (500)") + var/list/options = list("Blood Spear (150)", "Blood Beam (500)") var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options if(!choice) to_chat(user, "You decide against conducting a greater blood rite.") @@ -835,18 +835,6 @@ user.visible_message( "A [rite.name] appears at [user]'s feet!", \ "A [rite.name] materializes at your feet.") - if("Blood Bolt Barrage (300)") - if(uses < BLOOD_BARRAGE_COST) - to_chat(user, "You need [BLOOD_BARRAGE_COST] charges to perform this rite.") - else - var/obj/rite = new /obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/blood() - uses -= BLOOD_BARRAGE_COST - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, "Your hands glow with power!") - else - to_chat(user, "You need a free hand for this rite!") - qdel(rite) if("Blood Beam (500)") if(uses < BLOOD_BEAM_COST) to_chat(user, "You need [BLOOD_BEAM_COST] charges to perform this rite.") diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 6eed283b02f1..53d17bf325aa 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -703,47 +703,6 @@ L.visible_message("An unseen force pulls the blood spear from [L]'s hands!") spear.throw_at(owner, 10, 2, owner) - -/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/blood - name = "blood bolt barrage" - desc = "Blood for blood." - color = "#ff0000" - guns_left = 24 - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood - fire_sound = 'sound/magic/wand_teleport.ogg' - - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood - -/obj/item/ammo_casing/magic/arcane_barrage/blood - projectile_type = /obj/projectile/magic/arcane_barrage/blood - firing_effect_type = /obj/effect/temp_visual/cult/sparks - -/obj/projectile/magic/arcane_barrage/blood - name = "blood bolt" - icon_state = "mini_leaper" - nondirectional_sprite = TRUE - damage_type = BRUTE - impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter - -/obj/projectile/magic/arcane_barrage/blood/Bump(atom/target) - var/turf/T = get_turf(target) - playsound(T, 'sound/effects/splat.ogg', 50, TRUE) - if(iscultist(target)) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.stat != DEAD) - H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4) - if(isshade(target) || isconstruct(target)) - var/mob/living/simple_animal/M = target - if(M.health+5 < M.maxHealth) - M.adjustHealth(-5) - new /obj/effect/temp_visual/cult/sparks(T) - qdel(src) - else - ..() - /obj/item/blood_beam name = "\improper magical aura" desc = "Sinister looking aura that distorts the flow of reality around it." diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm deleted file mode 100644 index df784813df40..000000000000 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ /dev/null @@ -1,154 +0,0 @@ -/datum/outfit/prisoner - name = "Prison Escapee" - uniform = /obj/item/clothing/under/rank/prisoner - shoes = /obj/item/clothing/shoes/sneakers/orange - r_pocket = /obj/item/kitchen/knife/shiv - -/datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) - if(visualsOnly) - return - H.fully_replace_character_name(null,"NTP #CC-0[rand(111,999)]") //same as the lavaland prisoner transport, but this time they are from CC, or CentCom - -/datum/outfit/yalp_cultist - name = "Cultist of Yalp Elor" - uniform = /obj/item/clothing/under/rank/civilian/chaplain - suit = /obj/item/clothing/suit/chaplainsuit/holidaypriest - gloves = /obj/item/clothing/gloves/color/red - shoes = /obj/item/clothing/shoes/sneakers/black - mask = /obj/item/clothing/mask/gas/tiki_mask/yalp_elor - -/datum/outfit/waldo - name = "Waldo" - uniform = /obj/item/clothing/under/pants/jeans - suit = /obj/item/clothing/suit/striped_sweater - head = /obj/item/clothing/head/beanie/waldo - shoes = /obj/item/clothing/shoes/sneakers/brown - ears = /obj/item/radio/headset - glasses = /obj/item/clothing/glasses/regular/circle - -/datum/outfit/waldo/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) - if(visualsOnly) - return - H.fully_replace_character_name(null,"Waldo") - H.eye_color = "000" - H.gender = MALE - H.skin_tone = "caucasian3" - H.hairstyle = "Business Hair 3" - H.facial_hairstyle = "Shaved" - H.hair_color = "000" - H.facial_hair_color = H.hair_color - H.update_body() - if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) - var/list/no_drops = list() - no_drops += H.get_item_by_slot(ITEM_SLOT_FEET) - no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING) - no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING) - no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD) - no_drops += H.get_item_by_slot(ITEM_SLOT_EYES) - for(var/i in no_drops) - var/obj/item/I = i - ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT) - -/datum/outfit/synthetic - name = "Factory Error Synth" - uniform = /obj/item/clothing/under/color/white - ears = /obj/item/radio/headset - -/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/organ/eyes/robotic/glow/eyes = new() - eyes.Insert(src, drop_if_replaced = FALSE) - -/datum/outfit/spacepol - name = "Spacepol Officer" - uniform = /obj/item/clothing/under/rank/security/officer/beatcop - suit = /obj/item/clothing/suit/armor/vest/blueshirt - belt = /obj/item/gun/ballistic/automatic/pistol/candor - head = /obj/item/clothing/head/helmet/police - gloves = /obj/item/clothing/gloves/tackler/combat - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol - glasses = /obj/item/clothing/glasses/sunglasses - ears = /obj/item/radio/headset - l_pocket = /obj/item/ammo_box/magazine/m45 - r_pocket = /obj/item/restraints/handcuffs - id = /obj/item/card/id - -/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Police Officer" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/frontier/hunter - name = "Frontiersman Corpse (Hunter)" - ears = /obj/item/radio/headset - r_hand = /obj/item/gun/ballistic/rifle/illestren - -/datum/outfit/frontier/hunter/pre_equip(mob/living/carbon/human/H) - if(prob(50)) - head = /obj/item/clothing/head/trapper - -/datum/outfit/bountyarmor - name = "Bounty Hunter - Armored" - uniform = /obj/item/clothing/under/rank/prisoner - head = /obj/item/clothing/head/hunter - suit = /obj/item/clothing/suit/space/hunter - gloves = /obj/item/clothing/gloves/tackler/combat - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/gas/hunter - glasses = /obj/item/clothing/glasses/sunglasses/garb - ears = /obj/item/radio/headset - l_pocket = /obj/item/tank/internals/emergency_oxygen - r_pocket = /obj/item/restraints/handcuffs/cable - id = /obj/item/card/id - r_hand = /obj/item/flamethrower/full/tank - -/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Bounty Hunter" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/bountyhook - name = "Bounty Hunter - Hook" - uniform = /obj/item/clothing/under/rank/prisoner - back = /obj/item/storage/backpack - head = /obj/item/clothing/head/scarecrow_hat - gloves = /obj/item/clothing/gloves/botanic_leather - ears = /obj/item/radio/headset - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/scarecrow - r_pocket = /obj/item/restraints/handcuffs/cable - id = /obj/item/card/id - r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel/hook - - backpack_contents = list( - /obj/item/ammo_casing/shotgun/incapacitate = 6 - ) - -/datum/outfit/bountyhook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Bounty Hunter" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/bountysynth - name = "Bounty Hunter - Synth" - uniform = /obj/item/clothing/under/rank/prisoner - back = /obj/item/storage/backpack - suit = /obj/item/clothing/suit/armor/riot - shoes = /obj/item/clothing/shoes/jackboots - glasses = /obj/item/clothing/glasses/eyepatch - r_pocket = /obj/item/restraints/handcuffs/cable - ears = /obj/item/radio/headset - id = /obj/item/card/id - r_hand = /obj/item/storage/firstaid/regular diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 0e38dc57105d..1fb457eea64b 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -26,17 +26,3 @@ guns.owner = owner objectives += guns ..() - -/datum/antagonist/survivalist/magic - name = "Amateur Magician" - greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way." - -/datum/antagonist/survivalist/magic/greet() - ..() - to_chat(owner, "As a wonderful magician, you should remember that spellbooks don't mean anything if they are used up.") - -/datum/antagonist/survivalist/magic/forge_objectives() - var/datum/objective/steal_five_of_type/summon_magic/magic = new - magic.owner = owner - objectives += magic - ..() diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 58e397a64d40..69ff4bcfc2f5 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -106,10 +106,6 @@ name = "Fireball" spell_type = /obj/effect/proc_holder/spell/aimed/fireball -/datum/spellbook_entry/spell_cards - name = "Spell Cards" - spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards - /datum/spellbook_entry/rod_form name = "Rod Form" spell_type = /obj/effect/proc_holder/spell/targeted/rod_form @@ -223,18 +219,6 @@ . = ..() REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") -/datum/spellbook_entry/infinite_guns - name = "Lesser Summon Guns" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - -/datum/spellbook_entry/arcane_barrage - name = "Arcane Barrage" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - /datum/spellbook_entry/barnyard name = "Barnyard Curse" spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse @@ -291,47 +275,6 @@ dat += "[surplus] left.
" return dat -/datum/spellbook_entry/item/staffchange - name = "Staff of Change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - item_path = /obj/item/gun/magic/staff/change - -/datum/spellbook_entry/item/staffanimation - name = "Staff of Animation" - desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." - item_path = /obj/item/gun/magic/staff/animate - category = "Assistance" - -/datum/spellbook_entry/item/staffchaos - name = "Staff of Chaos" - desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." - item_path = /obj/item/gun/magic/staff/chaos - -/datum/spellbook_entry/item/spellblade - name = "Spellblade" - desc = "A sword capable of firing blasts of energy which rip targets limb from limb." - item_path = /obj/item/gun/magic/staff/spellblade - -/datum/spellbook_entry/item/staffdoor - name = "Staff of Door Creation" - desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." - item_path = /obj/item/gun/magic/staff/door - cost = 1 - category = "Mobility" - -/datum/spellbook_entry/item/staffhealing - name = "Staff of Healing" - desc = "An altruistic staff that can heal the lame and raise the dead." - item_path = /obj/item/gun/magic/staff/healing - cost = 1 - category = "Defensive" - -/datum/spellbook_entry/item/lockerstaff - name = "Staff of the Locker" - desc = "A staff that shoots lockers. It eats anyone it hits on its way, leaving a welded locker with your victims behind." - item_path = /obj/item/gun/magic/staff/locker - category = "Defensive" - /datum/spellbook_entry/item/scryingorb name = "Scrying Orb" desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon others and talk to the deceased. In addition, buying it will permanently grant you X-ray vision." @@ -356,12 +299,6 @@ item_path = /obj/item/necromantic_stone category = "Assistance" -/datum/spellbook_entry/item/wands - name = "Wand Assortment" - desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative with their use. Comes in a handy belt." - item_path = /obj/item/storage/belt/wands/full - category = "Defensive" - /datum/spellbook_entry/item/armor name = "Mastercrafted Armor Set" desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 14cf56d51ae0..96a41b2ac07b 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -204,7 +204,6 @@ if(APPRENTICE_HEALING) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null)) - H.put_in_hands(new /obj/item/gun/magic/staff/healing(H)) to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned life-saving survival spells. You are able to cast charge and forcewall.") if(APPRENTICE_ROBELESS) owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index c7aa46af728b..b64a2abf02de 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -487,7 +487,6 @@ /obj/item/shield/energy = 6, /obj/item/shield/riot/tele = 12, /obj/item/dnainjector/lasereyesmut = 7, - /obj/item/gun/magic/wand/fireball/inert = 3, /obj/item/pneumatic_cannon = 15, /obj/item/melee/transforming/energy/sword = 7, /obj/item/book/granter/spell/knock = 15, @@ -515,8 +514,6 @@ /obj/item/dualsaber = 15, /obj/item/organ/heart/demon = 7, /obj/item/gun/ballistic/automatic/smg/c20r = 16, - /obj/item/gun/magic/wand/resurrection/inert = 15, - /obj/item/gun/magic/wand/resurrection = 10, /obj/item/uplink/old = 2, /obj/item/book/granter/spell/charge = 12, /obj/item/grenade/clusterbuster/spawner_manhacks = 15, @@ -556,16 +553,6 @@ desc = "High speed, low drag combat boots, now with an added layer of insulation." min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT -/obj/item/gun/magic/wand/fireball/inert - name = "weakened wand of fireball" - desc = "This wand shoots scorching balls of fire that explode into destructive flames. The years of the cold have weakened the magic inside the wand." - max_charges = 4 - -/obj/item/gun/magic/wand/resurrection/inert - name = "weakened wand of healing" - desc = "This wand uses healing magics to heal and revive. The years of the cold have weakened the magic inside the wand." - max_charges = 5 - /obj/effect/mob_spawn/human/syndicatesoldier/coldres name = "Syndicate Snow Operative" outfit = /datum/outfit/snowsyndie/corpse diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index b330b0ec4bdc..4779886622a4 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -7,7 +7,6 @@ unit_name = "minor lava planet artifact" export_types = list(/obj/item/immortality_talisman, /obj/item/book_of_babel, - /obj/item/gun/magic/hook, /obj/item/wisp_lantern, /obj/item/reagent_containers/glass/bottle/potion/flight, /obj/item/katana/cursed, @@ -23,9 +22,7 @@ /obj/item/lava_staff, /obj/item/ship_in_a_bottle, /obj/item/clothing/shoes/clown_shoes/banana_shoes, - /obj/item/gun/magic/staff/honk, /obj/item/kitchen/knife/envy, - /obj/item/gun/ballistic/revolver/russian/soul, /obj/item/veilrender/vealrender, /obj/item/nullrod/scythe/talking/necro, /obj/item/clothing/suit/armor/ascetic) @@ -55,8 +52,7 @@ /obj/machinery/anomalous_crystal, /obj/item/mayhem, /obj/item/blood_contract, - /obj/item/guardiancreator/miner/choose,//this is basically the most valulable mining loot so good luck getting a miner to part ways - /obj/item/gun/magic/staff/spellblade, + /obj/item/guardiancreator/miner/choose//this is basically the most valulable mining loot so good luck getting a miner to part ways ) /* /datum/export/lavaland/trophycommon diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 662a549ca631..b9a4fb8f0ca3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -114,9 +114,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) "ipc_tail" = "None", "ipc_chassis" = "Morpheus Cyberkinetics (Custom)", "ipc_brain" = "Posibrain", - "kepori_feathers" = "Plain", - "kepori_body_feathers" = "Plain", - "kepori_tail_feathers" = "Fan", + "kepori_feathers" = "None", + "kepori_body_feathers" = "None", + "kepori_head_feathers" = "None", + "kepori_tail_feathers" = "None", "vox_head_quills" = "Plain", "vox_neck_quills" = "Plain", "elzu_horns" = "None", @@ -244,7 +245,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) return #define APPEARANCE_CATEGORY_COLUMN "" -#define MAX_MUTANT_ROWS 4 +#define MAX_MUTANT_ROWS 5 /datum/preferences/proc/ShowChoices(mob/user) show_loadout = (current_tab != 1) ? show_loadout : FALSE @@ -728,6 +729,19 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 + if("kepori_head_feathers" in pref_species.default_features) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN + + dat += "

Head Feathers

" + dat += "[features["kepori_head_feathers"]]
" + dat += "    Change
" + + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + if("kepori_body_feathers" in pref_species.default_features) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -836,10 +850,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) //Adds a thing to select which phobia because I can't be assed to put that in the quirks window if("Phobia" in all_quirks) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN dat += "

Phobia

" dat += "[phobia]
" + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + if("Smoker" in all_quirks) dat += "

Smoker

" @@ -853,6 +874,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[features["body_size"]]
" + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + + if(generic_adjective) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN dat += "

Character Adjective

" @@ -1970,6 +1999,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if (new_kepori_feathers) features["kepori_feathers"] = new_kepori_feathers + if("kepori_head_feathers") + var/new_kepori_feathers + new_kepori_feathers = input(user, "Choose your character's head feathers:", "Character Preference") as null|anything in GLOB.kepori_head_feathers_list + if (new_kepori_feathers) + features["kepori_head_feathers"] = new_kepori_feathers + if("kepori_body_feathers") var/new_kepori_feathers new_kepori_feathers = input(user, "Choose your character's body feathers:", "Character Preference") as null|anything in GLOB.kepori_body_feathers_list diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b53d761c41da..3c3040f03906 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -438,6 +438,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car READ_FILE(S["feature_ipc_brain"], features["ipc_brain"]) READ_FILE(S["feature_kepori_feathers"], features["kepori_feathers"]) READ_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"]) + READ_FILE(S["feature_kepori_head_feathers"], features["kepori_head_feathers"]) READ_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"]) READ_FILE(S["feature_vox_head_quills"], features["vox_head_quills"]) READ_FILE(S["feature_vox_neck_quills"], features["vox_neck_quills"]) @@ -548,8 +549,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list) features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list) features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain") - features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain") - features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan") + features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "None") + features["kepori_head_feathers"] = sanitize_inlist(features["kepori_head_feathers"], GLOB.kepori_head_feathers_list, "None") + features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "None") features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None") features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None") features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list) @@ -629,6 +631,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_ipc_brain"] , features["ipc_brain"]) WRITE_FILE(S["feature_kepori_feathers"] , features["kepori_feathers"]) WRITE_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"]) + WRITE_FILE(S["feature_kepori_head_feathers"], features["feature_kepori_head_feathers"]) WRITE_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"]) WRITE_FILE(S["feature_vox_head_quills"] , features["vox_head_quills"]) WRITE_FILE(S["feature_vox_neck_quills"] , features["vox_neck_quills"]) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b1e1cc1f2105..166f437dc3af 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -286,7 +286,7 @@ if("[layer]" in mob_species.offset_clothing) // This code taken from Baystation 12 - var/icon/final_I = icon('icons/blanks/32x32.dmi', "nothing") + var/icon/final_I = icon('icons/blanks/64x64.dmi', "nothing") var/list/shifts = mob_species.offset_clothing["[layer]"] // Apply all pixel shifts for each direction. @@ -294,9 +294,10 @@ var/list/facing_list = shifts[shift_facing] var/use_dir = text2num(shift_facing) var/icon/equip = icon(file2use, icon_state = state2use, dir = use_dir) - var/icon/canvas = icon('icons/blanks/32x32.dmi', "nothing") + var/icon/canvas = icon('icons/blanks/64x64.dmi', "nothing") canvas.Blend(equip, ICON_OVERLAY, facing_list["x"]+1, facing_list["y"]+1) final_I.Insert(canvas, dir = use_dir) + final_I = fcopy_rsc(final_I) GLOB.species_clothing_icons[mob_species.id]["[file2use]-[state2use]"] = final_I return TRUE diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 385baa647432..0698981207bf 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -248,7 +248,6 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/gray - /obj/item/clothing/glasses/hud/spacecop/hidden // for the undercover cop name = "sunglasses" desc = "These sunglasses are special, and let you view potential criminals." @@ -274,4 +273,3 @@ desc = "A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. This pair also corrects nearsightedness." icon_state = "prescriptionsecurityhud" vision_correction = 1 - diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 06bd05a45795..cbac3e0e8901 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -220,7 +220,7 @@ icon_state = "nitrile" transfer_prints = FALSE carrytrait = TRAIT_QUICKER_CARRY - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/gloves/color/latex/nitrile/evil name = "red nitrile gloves" @@ -240,10 +240,8 @@ desc = "Overdesigned engineering gloves that have automated construction subrutines dialed in, allowing for faster construction while worn." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_gauntlets" - siemens_coefficient = 0 //WS Station eddit "Tinkers Gloves Insuls" - permeability_coefficient = 0.05 //WS Station eddit "Tinkers Gloves Insuls" - //siemens_coefficient = 0.8 WS Station eddit "Tinkers Gloves Insuls" - //permeability_coefficient = 0.3 WS Station eddit "Tinkers Gloves Insuls" + siemens_coefficient = 0 + permeability_coefficient = 0.05 carrytrait = TRAIT_QUICK_BUILD custom_materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) @@ -276,7 +274,8 @@ /obj/item/clothing/gloves/color/light_brown = 1, /obj/item/clothing/gloves/color/brown = 1, /obj/item/clothing/gloves/color/white = 1, - /obj/item/clothing/gloves/color/rainbow = 1) + /obj/item/clothing/gloves/color/rainbow = 1, + ) /obj/item/clothing/gloves/maid name = "maid arm covers" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 314af8aaf44a..9d8db3c035d8 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -38,7 +38,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/gloves/combat/maid name = "combat maid sleeves" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 236f2ba1c81e..352349783bae 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -501,6 +501,7 @@ icon_state = "inteq_swat" item_state = "inteq_swat" flags_inv = HIDEHAIR + supports_variations = KEPORI_VARIATION content_overlays = TRUE /obj/item/clothing/head/helmet/inteq @@ -509,6 +510,7 @@ icon_state = "inteq_helmet" icon_state = "inteq_helmet" can_flashlight = TRUE + supports_variations = KEPORI_VARIATION content_overlays = TRUE /obj/item/clothing/head/solgov diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index d039d06dae35..100cc7ff0f52 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -226,8 +226,6 @@ backpack_contents = list( /obj/item/melee/transforming/energy/axe=1,\ /obj/item/storage/part_replacer/bluespace/tier4=1,\ - /obj/item/gun/magic/wand/resurrection/debug=1,\ - /obj/item/gun/magic/wand/death/debug=1,\ /obj/item/debug/human_spawner=1,\ /obj/item/debug/omnitool=1 ) diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index bd1817e1bf45..cb98f607089c 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -40,7 +40,7 @@ slowdown = 1 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS + cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index bb8cb8bedcb4..ee72151d9567 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -34,7 +34,7 @@ desc = "A Type I armored vest that provides decent protection against most types of damage." icon_state = "armor_alt" item_state = "armoralt" - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/suit/armor/vest/trauma name = "cybersun trauma team armor vest" @@ -322,7 +322,7 @@ desc = "A luxurious brown coat made from a crossweave of kevlar and ballistic fibre, the collar and wrist trims are made from genuine wolf fur. as protective as it is stylish." icon_state = "armor_inteq_battlecoat" item_state = "inteq_battlecoat" - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/suit/armor/hos/inteq/honorable //Basically CC higherup clothing for inteq name = "honorable vanguard battlecoat" @@ -330,7 +330,7 @@ icon_state = "armor_inteq_honorable_battlecoat" item_state = "inteq_honorable_battlecoat" armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90) - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/suit/armor/inteq/corpsman name = "inteq corpsman vest" diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 588a8f1600de..9b141148e5a2 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -1,5 +1,7 @@ // WINTER COATS +//Someone please make the allowed lists globals or something + /obj/item/clothing/suit/hooded/wintercoat name = "winter coat" desc = "A heavy jacket made from 'synthetic' animal furs." @@ -10,14 +12,14 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - allowed = list( /obj/item/flashlight, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/plasmaman, - /obj/item/toy, - /obj/item/storage/fancy/cigarettes, - /obj/item/lighter, - ) + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) /obj/item/clothing/head/hooded/winterhood name = "winter hood" @@ -29,13 +31,11 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" icon_state = "coatcaptain" item_state = "coatcaptain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/captain /obj/item/clothing/suit/hooded/wintercoat/captain/Initialize() @@ -44,13 +44,11 @@ /obj/item/clothing/head/hooded/winterhood/captain icon_state = "hood_captain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" icon_state = "coatsecurity" item_state = "coatsecurity" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/security /obj/item/clothing/suit/hooded/wintercoat/security/Initialize() @@ -59,19 +57,37 @@ /obj/item/clothing/head/hooded/winterhood/security icon_state = "hood_security" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) /obj/item/clothing/suit/hooded/wintercoat/medical name = "medical winter coat" icon_state = "coatmedical" item_state = "coatmedical" - allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical + allowed = list( + /obj/item/analyzer, + /obj/item/sensor_device, + /obj/item/stack/medical, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/hypospray, + /obj/item/healthanalyzer, + /obj/item/flashlight/pen, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/pill, + /obj/item/storage/pill_bottle, + /obj/item/paper, + /obj/item/melee/classic_baton/telescopic, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + ) /obj/item/clothing/head/hooded/winterhood/medical icon_state = "hood_medical" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) /obj/item/clothing/suit/hooded/wintercoat/medical/paramedic name = "paramedic winter coat" @@ -86,25 +102,52 @@ name = "science winter coat" icon_state = "coatscience" item_state = "coatscience" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science + allowed = list( + /obj/item/analyzer, + /obj/item/stack/medical, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/hypospray, + /obj/item/healthanalyzer, + /obj/item/flashlight/pen, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/pill, + /obj/item/storage/pill_bottle, + /obj/item/paper, + /obj/item/melee/classic_baton/telescopic, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + ) /obj/item/clothing/head/hooded/winterhood/science icon_state = "hood_science" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/hooded/wintercoat/engineering name = "engineering winter coat" icon_state = "coatengineer" item_state = "coatengineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/t_scanner, + /obj/item/construction/rcd, + /obj/item/pipe_dispenser, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) + /obj/item/clothing/head/hooded/winterhood/engineering icon_state = "hood_engineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos name = "atmospherics winter coat" @@ -119,8 +162,22 @@ name = "hydroponics winter coat" icon_state = "coathydro" item_state = "coathydro" - allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro + allowed = list( + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/plant_analyzer, + /obj/item/seeds, + /obj/item/reagent_containers/glass/bottle, + /obj/item/cultivator, + /obj/item/reagent_containers/spray/pestspray, + /obj/item/hatchet, + /obj/item/storage/bag/plants, + /obj/item/toy, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) /obj/item/clothing/head/hooded/winterhood/hydro icon_state = "hood_hydro" @@ -138,13 +195,18 @@ name = "mining winter coat" icon_state = "coatminer" item_state = "coatminer" - allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/miner + allowed = list( + /obj/item/pickaxe, + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) /obj/item/clothing/head/hooded/winterhood/miner icon_state = "hood_miner" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // Inteq @@ -154,18 +216,17 @@ icon_state = "coatinteq" item_state = "coatinteq" hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/head/hooded/winterhood/security/inteq icon_state = "hood_inteq" - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt name = "inteq hooded coat" desc = "A hooded coat with a fur trim around the hood, comfy! It has a small 'IRMG' embroidered onto the shoulder." icon_state = "coatinteq_alt" item_state = "coatinteq_alt" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq/alt /obj/item/clothing/head/hooded/winterhood/security/inteq/alt @@ -173,15 +234,14 @@ desc = "A comfortable looking brown hood." icon_state = "hood_inteq_alt" item_state = "hood_inteq_alt" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) // CentCom + /obj/item/clothing/suit/hooded/wintercoat/centcom name = "centcom winter coat" desc = "A luxurious winter coat woven in the bright green and gold colours of Central Command. It has a small pin in the shape of the Nanotrasen logo for a zipper." icon_state = "coatcentcom" item_state = "coatcentcom" - armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom /obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize(mapload) @@ -190,7 +250,6 @@ /obj/item/clothing/head/hooded/winterhood/centcom icon_state = "hood_centcom" - armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) // SolGov @@ -199,9 +258,7 @@ desc = "An environment-resistant wintercoat in the colors of the Solarian Confederation." icon_state = "coatsolgov" item_state = "coatsolgov" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/solgov /obj/item/clothing/head/hooded/winterhood/solgov icon_state = "hood_solgov" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index 2341da5567a9..0af578bfd452 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -1,7 +1,7 @@ /obj/item/clothing/under/rank/cargo icon = 'icons/obj/clothing/under/cargo.dmi' mob_overlay_icon = 'icons/mob/clothing/under/cargo.dmi' - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/under/rank/cargo/qm name = "quartermaster's jumpsuit" @@ -16,7 +16,7 @@ item_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/rank/cargo/tech name = "cargo technician's jumpsuit" @@ -24,7 +24,7 @@ icon_state = "cargotech" item_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION alt_covers_chest = TRUE /obj/item/clothing/under/rank/cargo/tech/skirt @@ -33,7 +33,7 @@ icon_state = "cargo_skirt" item_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION can_adjust = FALSE /obj/item/clothing/under/rank/cargo/miner @@ -43,7 +43,7 @@ item_state = "miner" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 0) resistance_flags = NONE - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/under/rank/cargo/miner/lavaland desc = "A light uniform for operating in hazardous environments, manufactured en-masse by EXOCOM for the profitable frontier prospector market. Adventurous khaki jeans included." @@ -51,14 +51,14 @@ icon_state = "explorer" item_state = "explorer" can_adjust = TRUE - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION /obj/item/clothing/under/rank/cargo/miner/hazard desc = "A thick jumpsuit with reflective stripes for hazardous, low-visibility environments. It's coated in a thick layer of asteroid dust." name = "asteroid miner's jumpsuit" icon_state = "hazard" item_state = "hazard" - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/rank/cargo/miner/lavaland/old icon_state = "explorerold" diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index bf462c7fda4d..183e957d2338 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -174,7 +174,7 @@ desc = "A light white gown that allows easy access to any patient who wears this." icon_state = "gownwhite" item_state = "gownwhite" - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION can_adjust = FALSE /obj/item/clothing/under/rank/medical/gown/green diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 1dabceb6db24..f74748f71fbb 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -93,4 +93,4 @@ desc = "A pretty red dress with big pink ribbons attached. Intended to be worn by Kepori cosplayers, but also fits other species." icon_state = "rilena_dress" item_state = "rilena_dress" - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 9eb76ee6bf5e..85c9996489e2 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -7,7 +7,7 @@ alt_covers_chest = TRUE icon = 'icons/obj/clothing/under/syndicate.dmi' mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi' - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION /obj/item/clothing/under/syndicate/skirt name = "tactical skirtleneck" @@ -17,7 +17,7 @@ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) alt_covers_chest = TRUE can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/syndicate/bloodred name = "blood-red sneaksuit" @@ -27,7 +27,7 @@ armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40) resistance_flags = FIRE_PROOF | ACID_PROOF can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/bloodred/sleepytime name = "blood-red pajamas" @@ -35,7 +35,7 @@ icon_state = "bloodred_pajamas" item_state = "bl_suit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/tacticool name = "tacticool turtleneck" @@ -43,7 +43,7 @@ icon_state = "tactifool" item_state = "bl_suit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION /obj/item/clothing/under/syndicate/tacticool/skirt name = "tacticool skirtleneck" @@ -52,7 +52,7 @@ item_state = "bl_suit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/syndicate/sniper name = "Tactical turtleneck suit" @@ -75,7 +75,7 @@ desc = "With a suit lined with this many pockets, you are ready to operate." icon_state = "syndicate_combat" can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/rus_army name = "advanced military tracksuit" @@ -100,7 +100,7 @@ can_adjust = FALSE armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) alt_covers_chest = TRUE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/cybersun name = "cybersun jumpsuit" @@ -115,7 +115,7 @@ icon_state = "cybersun" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 100) alt_covers_chest = TRUE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/cybersun/officer name = "cybersun officer's suit" @@ -130,7 +130,7 @@ icon_state = "cybersun_med" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/syndicate/medic/skirt name = "Cybersun medical jumpskirt" @@ -138,7 +138,7 @@ icon_state = "cybersun_med_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/syndicate/donk name = "Donk! Co. employee uniform" @@ -148,14 +148,14 @@ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) body_parts_covered = CHEST|GROIN|ARMS alt_covers_chest = TRUE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/donk/qm name = "Donk! Co. manager uniform" desc = "The standard uniform of Donk Co. managers. Direct all complaints here." icon_state = "donk_qm" body_parts_covered = CHEST|GROIN|LEGS|ARMS - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/suit/hazardvest/donk name = "Donk! Co. employee vest" diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm deleted file mode 100644 index 68a38f0479e1..000000000000 --- a/code/modules/events/wizard/magicarp.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/round_event_control/wizard/magicarp //these fish is loaded - name = "Magicarp" - weight = 1 - typepath = /datum/round_event/wizard/magicarp - max_occurrences = 1 - earliest_start = 0 MINUTES - -/datum/round_event/wizard/magicarp - announceWhen = 3 - startWhen = 50 - -/datum/round_event/wizard/magicarp/setup() - startWhen = rand(40, 60) - -/datum/round_event/wizard/magicarp/announce(fake) - priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") - -/datum/round_event/wizard/magicarp/start() - for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) - if(prob(5)) - new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc) - else - new /mob/living/simple_animal/hostile/carp/ranged(C.loc) - -/mob/living/simple_animal/hostile/carp/ranged - name = "magicarp" - desc = "50% magic, 50% carp, 100% horrible." - icon_state = "magicarp" - icon_living = "magicarp" - icon_dead = "magicarp_dead" - icon_gib = "magicarp_gib" - ranged = 1 - retreat_distance = 2 - minimum_distance = 0 //Between shots they can and will close in to nash - projectiletype = /obj/projectile/magic - projectilesound = 'sound/weapons/emitter.ogg' - maxHealth = 50 - health = 50 - gold_core_spawnable = NO_SPAWN - random_color = FALSE - food_type = list() - tame_chance = 0 - bonus_tame_chance = 0 - var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) - -/mob/living/simple_animal/hostile/carp/ranged/Initialize() - projectiletype = pick(allowed_projectile_types) - . = ..() - -/mob/living/simple_animal/hostile/carp/ranged/chaos - name = "chaos magicarp" - desc = "50% carp, 100% magic, 150% horrible." - color = "#00FFFF" - maxHealth = 75 - health = 75 - gold_core_spawnable = NO_SPAWN - -/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot() - projectiletype = pick(allowed_projectile_types) - ..() - -/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool - gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport, - /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, - /obj/projectile/magic/spell/magic_missile, /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/locker) //thanks Lett1 /finally, we can synthesize the lockerfish - -/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology - gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing, - /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 817970a00602..7ba30d327444 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -315,10 +315,6 @@ /obj/item/hierophant_club, /obj/item/gun/energy/minigun, /obj/item/gun/ballistic/automatic/hmg/l6_saw, - /obj/item/gun/magic/staff/chaos, - /obj/item/gun/magic/staff/spellblade, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/fireball, /obj/item/stack/telecrystal/twenty, /obj/item/nuke_core, /obj/item/phylactery, diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 88e1d066024f..7b80559d2691 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -66,8 +66,6 @@ new /obj/item/wisp_lantern(src) if(20) new /obj/item/immortality_talisman(src) - if(21) - new /obj/item/gun/magic/hook(src) if(22) new /obj/item/voodoo(src) if(23) @@ -143,8 +141,6 @@ new /obj/item/wisp_lantern(src) if(20) new /obj/item/immortality_talisman(src) - if(21) - new /obj/item/gun/magic/hook(src) if(22) new /obj/item/voodoo(src) if(23) @@ -481,91 +477,6 @@ /obj/effect/warp_cube/ex_act(severity, target) return -//Meat Hook -/obj/item/gun/magic/hook - name = "meat hook" - desc = "A light hooked blade, attached by the handle to a long chain. Can be used to make quick strikes in hand, or thrown at enemies, magically dragging them to the user. Get over here!" - ammo_type = /obj/item/ammo_casing/magic/hook - icon_state = "hook" - item_state = "hook" - lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' - fire_sound = 'sound/weapons/batonextend.ogg' - max_charges = 1 - item_flags = NEEDS_PERMIT - force = 15 - sharpness = IS_SHARP - block_chance = 5//A pittance, but might be worth something in a scuffle - hitsound = 'sound/weapons/chainhit.ogg' - -/obj/item/gun/magic/hook/melee_attack_chain(mob/user, atom/target, params) - ..() - user.changeNext_move(CLICK_CD_MELEE * 0.5)//quick to swing. 15 force can be quite something with this attack frequency. - -/obj/item/gun/magic/hook/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 15, 130, 0, hitsound) - -/obj/item/ammo_casing/magic/hook - name = "hook" - desc = "A hook." - projectile_type = /obj/projectile/hook - caliber = "hook" - icon_state = "arrow" - -/obj/projectile/hook - name = "hook" - icon_state = "hook" - icon = 'icons/obj/lavaland/artefacts.dmi' - pass_flags = PASSTABLE - damage = 20 - stamina = 20 - armour_penetration = 60 - damage_type = BRUTE - hitsound = 'sound/effects/splat.ogg' - var/chain - var/knockdown_time = (0.5 SECONDS) - -/obj/projectile/hook/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "chain", emissive = FALSE) - ..() - //TODO: root the firer until the chain returns - -/obj/projectile/hook/on_hit(atom/target) - . = ..() - if(ismovable(target)) - var/atom/movable/A = target - if(A.anchored) - return - A.visible_message("[A] is snagged by [firer]'s hook!") - new /datum/forced_movement(A, get_turf(firer), 5, TRUE) - if (isliving(target)) - var/mob/living/fresh_meat = target - fresh_meat.Knockdown(knockdown_time) - return - //TODO: keep the chain beamed to A - //TODO: needs a callback to delete the chain - -/obj/projectile/hook/Destroy() - qdel(chain) - return ..() - -//just a nerfed version of the real thing for the bounty hunters. -/obj/item/gun/magic/hook/bounty - name = "hook" - ammo_type = /obj/item/ammo_casing/magic/hook/bounty - -/obj/item/gun/magic/hook/bounty/shoot_with_empty_chamber(mob/living/user) - to_chat(user, "The [src] isn't ready to fire yet!") - -/obj/item/ammo_casing/magic/hook/bounty - projectile_type = /obj/projectile/hook/bounty - -/obj/projectile/hook/bounty - damage = 0 - stamina = 40 - //Immortality Talisman: Now with state-of-the-art panic button technology /obj/item/immortality_talisman name = "\improper Immortality Talisman" @@ -1303,7 +1214,6 @@ new /obj/item/lava_staff(src) if(3) new /obj/item/book/granter/spell/sacredflame(src) - new /obj/item/gun/magic/wand/fireball(src) if(4) new /obj/item/dragons_blood(src) @@ -1519,14 +1429,12 @@ /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() new /obj/item/clothing/suit/space/hostile_environment(src) new /obj/item/clothing/head/helmet/space/hostile_environment(src) - var/loot = rand(1,3) + var/loot = rand(1,2) switch(loot) if(1) new /obj/item/mayhem(src) if(2) new /obj/item/blood_contract(src) - if(3) - new /obj/item/gun/magic/staff/spellblade(src) /obj/item/mayhem name = "mayhem in a bottle" diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 25722dd28e5f..8fbf9c32a38e 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -335,8 +335,6 @@ if(GLOB.summon_guns_triggered) give_guns(humanc) - if(GLOB.summon_magic_triggered) - give_magic(humanc) if(GLOB.curse_of_madness_triggered) give_madness(humanc, GLOB.curse_of_madness_triggered) if(CONFIG_GET(flag/roundstart_traits)) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm index 4ed949c63ef8..9fd4579e46f8 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm @@ -1,10 +1,9 @@ -//Kepori mutant parts - -//Start head feathers +// "Hair" feathers /datum/sprite_accessory/kepori_feathers color_src = HAIR - icon = 'icons/mob/kepori_parts.dmi' + body_zone = BODY_ZONE_HEAD + icon = 'icons/mob/species/kepori/kepori_parts.dmi' /datum/sprite_accessory/kepori_feathers/none name = "None" @@ -37,10 +36,6 @@ name = "Spikey" icon_state = "spikey" -/datum/sprite_accessory/kepori_feathers/soap - name = "Soap" - icon_state = "soap" - /datum/sprite_accessory/kepori_feathers/crowned name = "Crowned" icon_state = "crowned" @@ -57,40 +52,60 @@ name = "Bun" icon_state = "bun" -//Start body feathers +// Head/Face feathers + +/datum/sprite_accessory/kepori_head_feathers + color_src = MUTCOLORS_SECONDARY + body_zone = BODY_ZONE_HEAD + icon = 'icons/mob/species/kepori/kepori_parts.dmi' + +/datum/sprite_accessory/kepori_head_feathers/none + name = "None" + +/datum/sprite_accessory/kepori_head_feathers/full + name = "Full" + icon_state = "full" + +/datum/sprite_accessory/kepori_head_feathers/half + name = "Half" + icon_state = "half" + +// Body feathers /datum/sprite_accessory/kepori_body_feathers color_src = MUTCOLORS_SECONDARY - icon = 'icons/mob/kepori_parts.dmi' + body_zone = BODY_ZONE_CHEST + icon = 'icons/mob/species/kepori/kepori_parts.dmi' /datum/sprite_accessory/kepori_body_feathers/none name = "None" -/datum/sprite_accessory/kepori_body_feathers/aftik - name = "Aftik" - icon_state = "aftik" - /datum/sprite_accessory/kepori_body_feathers/belly name = "Belly" icon_state = "belly" -/datum/sprite_accessory/kepori_body_feathers/shirt - name = "Shirt" - icon_state = "shirt" +/datum/sprite_accessory/kepori_body_feathers/belly_wings + name = "Belly + Wings" + icon_state = "bwings" /datum/sprite_accessory/kepori_body_feathers/soap name = "Soap" icon_state = "soap" +/datum/sprite_accessory/kepori_body_feathers/soap_wings + name = "Soap + Wings" + icon_state = "swings" + /datum/sprite_accessory/kepori_body_feathers/wings name = "Wings" icon_state = "wings" -//Start tail feathers +// Tail feathers /datum/sprite_accessory/kepori_tail_feathers color_src = MUTCOLORS_SECONDARY - icon = 'icons/mob/kepori_parts.dmi' + body_zone = BODY_ZONE_CHEST + icon = 'icons/mob/species/kepori/kepori_parts.dmi' /datum/sprite_accessory/kepori_tail_feathers/none name = "None" diff --git a/code/modules/mob/living/carbon/human/consistent_human.dm b/code/modules/mob/living/carbon/human/consistent_human.dm index e63adffeee48..86e6e08c4367 100644 --- a/code/modules/mob/living/carbon/human/consistent_human.dm +++ b/code/modules/mob/living/carbon/human/consistent_human.dm @@ -31,6 +31,7 @@ dna.features["spider_spinneret"] = GLOB.spider_spinneret_list[hex2num(copytext(seed, 11, 12)) % length(GLOB.spider_spinneret_list) + 1] dna.features["kepori_feathers"] = GLOB.kepori_feathers_list[hex2num(copytext(seed, 12, 13)) % length(GLOB.kepori_feathers_list) + 1] dna.features["kepori_body_feathers"] = GLOB.kepori_body_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_body_feathers_list) + 1] + dna.features["kepori_head_feathers"] = GLOB.kepori_head_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_head_feathers_list) + 1] dna.features["vox_head_quills"] = GLOB.vox_head_quills_list[hex2num(copytext(seed, 14, 15)) % length(GLOB.vox_head_quills_list) + 1] dna.features["vox_neck_quills"] = GLOB.vox_neck_quills_list[hex2num(copytext(seed, 15, 16)) % length(GLOB.vox_neck_quills_list) + 1] dna.features["elzu_horns"] = GLOB.elzu_horns_list[hex2num(copytext(seed, 16, 17)) % length(GLOB.elzu_horns_list) + 1] diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 166d2d4e83a0..e848bc01d251 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -688,16 +688,27 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) var/mutable_appearance/eye_overlay var/mutable_appearance/sclera_overlay + if(eyes) if(!HAS_TRAIT(H, TRAIT_EYESCLOSED) && !(H.stat == DEAD)) - eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER) - sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER) + + if(iskepori(H)) // Kepori need sclera but don't fit the normal silhouette, so this needs changing. Make better later. + eye_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER) + sclera_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER) + + else + eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER) + sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER) + if((EYECOLOR in species_traits) && eyes) eye_overlay.color = "#" + H.eye_color + if((SCLERA in species_traits) && eyes) sclera_overlay.color = "#" + H.sclera_color standing += sclera_overlay + standing += eye_overlay + if(EMOTE_OVERLAY in species_traits) // blush if (HAS_TRAIT(H, TRAIT_BLUSHING)) // Caused by either the *blush emote or the "drunk" mood event @@ -939,6 +950,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) S = GLOB.spider_spinneret_list[H.dna.features["spider_spinneret"]] if("kepori_body_feathers") S = GLOB.kepori_body_feathers_list[H.dna.features["kepori_body_feathers"]] + if("kepori_head_feathers") + S = GLOB.kepori_head_feathers_list[H.dna.features["kepori_head_feathers"]] if("kepori_tail_feathers") S = GLOB.kepori_tail_feathers_list[H.dna.features["kepori_tail_feathers"]] if("kepori_feathers") diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm index 5693c646cf3f..3278d3d77c1e 100644 --- a/code/modules/mob/living/carbon/human/species_types/kepori.dm +++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm @@ -2,10 +2,10 @@ name = "\improper Kepori" id = SPECIES_KEPORI default_color = "6060FF" - species_traits = list(MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY) + species_traits = list(SCLERA, MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY) inherent_traits = list(TRAIT_SCOOPABLE) - mutant_bodyparts = list("kepori_body_feathers", "kepori_tail_feathers", "kepori_feathers") - default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "Plain", "kepori_body_feathers" = "Plain", "kepori_tail_feathers" = "Fan", "body_size" = "Normal") + mutant_bodyparts = list("kepori_body_feathers", "kepori_head_feathers", "kepori_tail_feathers", "kepori_feathers") + default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "None", "kepori_head_feathers" = "None", "kepori_body_feathers" = "None", "kepori_tail_feathers" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken disliked_food = FRIED | GROSS | CLOTH liked_food = MEAT | GORE @@ -15,7 +15,7 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' species_clothing_path = 'icons/mob/clothing/species/kepori.dmi' - species_eye_path = 'icons/mob/kepori_parts.dmi' + species_eye_path = 'icons/mob/species/kepori/kepori_eyes.dmi' heatmod = 0.67 coldmod = 1.5 brutemod = 1.5 @@ -57,17 +57,64 @@ species_robotic_l_leg = /obj/item/bodypart/leg/left/robot/surplus/kepori species_robotic_r_leg = /obj/item/bodypart/leg/right/robot/surplus/kepori + robotic_eyes = /obj/item/organ/eyes/robotic/kepori + /datum/species/kepori/New() . = ..() // This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason. // Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes, // BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly. offset_clothing = list( - "[HEAD_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)), - "[GLASSES_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)), - "[FACEMASK_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -5), "[EAST]" = list("x" = 4, "y" = -5), "[SOUTH]" = list("x" = 0, "y" = -5), "[WEST]" = list("x" = -4, "y" = -5)), + "[HEAD_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), //ISSUE: The head sprites seem to be cut off when given an offset this large, combined with kepori offset + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[GLASSES_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[FACEMASK_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[BELT_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -1), + "[EAST]" = list("x" = 8, "y" = -1), + "[SOUTH]" = list("x" = 8, "y" = -1), + "[WEST]" = list("x" = 9, "y" = -1) + ), + "[EARS_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[SUIT_STORE_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -1), + "[EAST]" = list("x" = 8, "y" = -1), + "[SOUTH]" = list("x" = 8, "y" = -1), + "[WEST]" = list("x" = -8, "y" = -1) + ), ) +// First list is left hand, second list is right hand. This is used for inhand offsets. +/datum/species/kepori/get_item_offsets_for_dir(dir, hand) + //LEFT/RIGHT + if(dir & NORTH) + return list(list("x" = 9, "y" = -1), list("x" = 7, "y" = -1)) + if(dir & SOUTH) + return list(list("x" = 7, "y" = -1), list("x" = 9, "y" = -1)) + if(dir & EAST) + return list(list("x" = 18, "y" = -2), list("x" = 21, "y" = -2)) //("x" = 18, "y" = 2), list("x" = 21, "y" = -1)) + if(dir & WEST) + return list(list("x" = -4, "y" = -2), list("x" = -1, "y" = -2)) //("x" = -5, "y" = -1), list("x" = -1, "y" = 2)) + /datum/species/kepori/random_name(gender,unique,lastname) if(unique) return random_unique_kepori_name() @@ -86,17 +133,27 @@ return equip_delay_self_check(I, H, bypass_equip_delay_self) /datum/species/kepori/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - ..() + . = ..() + + C.base_pixel_x -= 8 + C.pixel_x = C.base_pixel_x + C.update_hands_on_rotate() + if(ishuman(C)) keptackle = new keptackle.Grant(C) /datum/species/kepori/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + + C.base_pixel_x += 8 + C.pixel_x = C.base_pixel_x + C.stop_updating_hands() + if(keptackle) keptackle.Remove(C) - qdel(C.GetComponent(/datum/component/tackler)) - ..() + qdel(C.GetComponent(/datum/component/tackler)) /datum/action/innate/keptackle name = "Pounce" diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 6cb15357cc64..c34a70b3afde 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -21,7 +21,6 @@ exotic_bloodtype = "L" disliked_food = GRAIN | DAIRY | CLOTH | GROSS liked_food = GORE | MEAT - inert_mutation = FIREBREATH deathsound = 'sound/voice/lizard/deathsound.ogg' wings_icons = list("Dragon") species_language_holder = /datum/language_holder/lizard diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm index fd03e184b9ba..b9cc8306762e 100644 --- a/code/modules/mob/living/carbon/human/species_types/vox.dm +++ b/code/modules/mob/living/carbon/human/species_types/vox.dm @@ -67,14 +67,29 @@ /datum/species/vox/New() . = ..() + // This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason. + // Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes, + // BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly. + offset_clothing = list( + "[SUIT_STORE_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = 0), + "[EAST]" = list("x" = 8, "y" = 0), + "[SOUTH]" = list("x" = 8, "y" = 0), + "[WEST]" = list("x" = -8, "y" = 0) + ), + "[EARS_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = 0), + "[EAST]" = list("x" = 8, "y" = 0), + "[SOUTH]" = list("x" = 8, "y" = 0), + "[WEST]" = list("x" = -8, "y" = 0) + ), + ) /datum/species/vox/random_name(gender,unique,lastname) if(unique) return random_unique_vox_name() return vox_name() - - /datum/species/vox/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) . = ..() C.base_pixel_x -= 9 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index be99a1e4d547..beecda12b083 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,5 +1,4 @@ #define RESOLVE_ICON_STATE(I) (I.mob_overlay_state || I.icon_state) -#define CHECK_USE_AUTOGEN (handled_by_bodytype ? null : dna.species) //Is this gross overuse of macros? Yes. Fuck you. /////////////////////// //UPDATE_ICONS SYSTEM// @@ -111,9 +110,6 @@ There are several things that need to be remembered: if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) return - var/target_overlay = U.icon_state - if(U.adjusted == ALT_STYLE) - target_overlay = "[target_overlay]_d" var/t_color = U.item_color @@ -122,10 +118,18 @@ There are several things that need to be remembered: if(U.adjusted == ALT_STYLE) t_color = "[t_color]_d" + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/uniform_overlay + ///icon file of the clothing var/icon_file = U.mob_overlay_icon - var/handled_by_bodytype = TRUE + ///The icon state to overlay + var/target_overlay = U.icon_state + if(U.adjusted == ALT_STYLE) + target_overlay = "[target_overlay]_d" + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + if(!uniform_overlay) //Kapu's autistic attempt at digitigrade handling //Hi Kapu @@ -135,21 +139,29 @@ There are several things that need to be remembered: icon_file = U.mob_overlay_icon target_overlay = "[target_overlay]_digi" - else if((dna.species.bodytype & BODYTYPE_VOX) && (U.supports_variations & VOX_VARIATION)) - icon_file = VOX_UNIFORM_PATH - if(U.vox_override_icon) - icon_file = U.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(U.supports_variations & VOX_VARIATION) + icon_file = VOX_UNIFORM_PATH + if(U.vox_override_icon) + icon_file = U.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(U.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_UNIFORM_PATH + if(U.kepoi_override_icon) + icon_file = U.kepoi_override_icon + else + handled_by_bodytype = TRUE - else if((dna.species.bodytype & BODYTYPE_KEPORI) && (U.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_UNIFORM_PATH - if(U.kepoi_override_icon) - icon_file = U.kepoi_override_icon if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(U)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = U.mob_overlay_icon || DEFAULT_UNIFORM_PATH - uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = use_autogen) if(!uniform_overlay) return @@ -176,7 +188,8 @@ There are several things that need to be remembered: var/handled_by_bodytype //TODO: add an icon file for ID slot stuff, so it's less snowflakey - id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = use_autogen) if(!id_overlay) return @@ -206,29 +219,41 @@ There are several things that need to be remembered: //Bloody hands end - var/mutable_appearance/gloves_overlay + if(gloves) var/obj/item/I = gloves update_hud_gloves(I) - var/handled_by_bodytype = TRUE + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/gloves_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_GLOVES_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_GLOVES_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_GLOVES_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_GLOVES_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_GLOVES_PATH - gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen) if(!gloves_overlay) return @@ -250,25 +275,37 @@ There are several things that need to be remembered: var/obj/item/I = glasses update_hud_glasses(I) if(!(head?.flags_inv & HIDEEYES) && !(wear_mask?.flags_inv & HIDEEYES)) + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/glasses_overlay - var/handled_by_bodytype = TRUE + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_GLASSES_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon -/*uncomment post kepori resprite - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_GLASSES_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon -*/ + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_GLASSES_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_GLASSES_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_GLASSES_PATH - glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen) if(!glasses_overlay) return @@ -288,27 +325,38 @@ There are several things that need to be remembered: if(ears) var/obj/item/I = ears - var/mutable_appearance/ears_overlay update_hud_ears(I) - var/handled_by_bodytype = TRUE + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/ears_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_EARS_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_EARS_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_EARS_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon -/*uncomment post kepori resprite - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_EARS_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon -*/ if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_EARS_PATH - ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = use_autogen) if(!ears_overlay) return @@ -328,11 +376,17 @@ There are several things that need to be remembered: if(shoes) var/obj/item/I = shoes + update_hud_shoes(I) + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/shoes_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state - update_hud_shoes(I) - var/handled_by_bodytype = TRUE + + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))) var/obj/item/bodypart/leg = src.get_bodypart(BODY_ZONE_L_LEG) @@ -342,21 +396,28 @@ There are several things that need to be remembered: icon_file = I.mob_overlay_icon target_overlay = "[target_overlay]_digi" - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_SHOES_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_SHOES_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_SHOES_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_SHOES_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_SHOES_PATH - shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay) if(!shoes_overlay) return @@ -394,31 +455,44 @@ There are several things that need to be remembered: inv.update_appearance() if(head) var/obj/item/I = head - var/mutable_appearance/head_overlay update_hud_head(I) - var/handled_by_bodytype = TRUE + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/head_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD) if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION)) target_overlay = "[target_overlay]_snouted" - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_HEAD_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_HEAD_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_HEAD_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_HEAD_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_HEAD_PATH - head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay) if(!head_overlay) return @@ -436,26 +510,39 @@ There are several things that need to be remembered: if(belt) var/obj/item/I = belt - var/mutable_appearance/belt_overlay update_hud_belt(I) - var/handled_by_bodytype + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/belt_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon - if((I.supports_variations & VOX_VARIATION) && (dna.species.bodytype & BODYTYPE_VOX)) - icon_file = VOX_BELT_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + - //if((I.supports_variations & KEPORI_VARIATION) && (dna.species.bodytype & BODYTYPE_KEPORI)) - //icon_file = KEPORI_BELT_PATH - //if(I.kepoi_override_icon) -// icon_file = I.kepoi_override_icon + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_BELT_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_BELT_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_BELT_PATH - belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen) if(!belt_overlay) return @@ -474,33 +561,46 @@ There are several things that need to be remembered: if(wear_suit) var/obj/item/I = wear_suit - var/mutable_appearance/suit_overlay update_hud_wear_suit(I) + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/suit_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state - var/handled_by_bodytype = TRUE + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))) icon_file = DIGITIGRADE_SUIT_PATH if((I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)) icon_file = I.mob_overlay_icon target_overlay = "[target_overlay]_digi" - else if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_SUIT_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_SUIT_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - else if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_SUIT_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_SUIT_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = I.mob_overlay_icon - suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay) if(!suit_overlay) return @@ -546,31 +646,44 @@ There are several things that need to be remembered: if(wear_mask) var/obj/item/I = wear_mask update_hud_wear_mask(I) + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/mask_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state - var/handled_by_bodytype = TRUE + + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE if(!(ITEM_SLOT_MASK in check_obscured_slots())) var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD) if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION)) target_overlay = "[target_overlay]_snouted" - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_MASK_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon - - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_MASK_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_MASK_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_MASK_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) icon_file = DEFAULT_MASK_PATH - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE - mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay) if(!mask_overlay) return @@ -588,17 +701,48 @@ There are several things that need to be remembered: if(wear_neck) var/obj/item/I = wear_neck + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/neck_overlay + + ///icon file of the clothing + var/icon_file = I.mob_overlay_icon + ///The icon state to overlay + var/target_overlay = I.icon_state + + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + + update_hud_neck(I) if(!(ITEM_SLOT_NECK in check_obscured_slots())) - var/icon_file = I.mob_overlay_icon - var/handled_by_bodytype = TRUE + + if(dna.species.bodytype & BODYTYPE_VOX) // there is neither a vox or kepori neck path, we just tell it to greyscale no matter what +// if(I.supports_variations & VOX_VARIATION) +// icon_file = VOX_NECK_PATH +// if(I.vox_override_icon) +// icon_file = I.vox_override_icon +// else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) +// if(I.supports_variations & KEPORI_VARIATION) +// icon_file = KEPORI_NECK_PATH +// if(I.kepoi_override_icon) +// icon_file = I.kepoi_override_icon +// else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_NECK_PATH - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + neck_overlay = I.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay) + if(!neck_overlay) + return + + overlays_standing[NECK_LAYER] = neck_overlay apply_overlay(NECK_LAYER) @@ -611,23 +755,42 @@ There are several things that need to be remembered: if(back) var/obj/item/I = back - var/mutable_appearance/back_overlay update_hud_back(I) - var/icon_file = I.mob_overlay_icon - var/handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_BACK_PATH + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/back_overlay - if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I))) - icon_file = DEFAULT_BACK_PATH - handled_by_bodytype = FALSE + ///icon file of the clothing + var/icon_file = I.mob_overlay_icon - back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + /// Does this clothing need to be generated via greyscale + var/handled_by_bodytype = FALSE if(!back_overlay) - return - overlays_standing[BACK_LAYER] = back_overlay - apply_overlay(BACK_LAYER) + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_BACK_PATH + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) +// if(I.supports_variations & KEPORI_VARIATION) +// icon_file = KEPORI_BACK_PATH +// else + handled_by_bodytype = TRUE + + if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I))) + icon_file = DEFAULT_BACK_PATH + handled_by_bodytype = TRUE + + var/use_autogen = handled_by_bodytype ? dna.species : null + back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = use_autogen) + + if(!back_overlay) + return + overlays_standing[BACK_LAYER] = back_overlay + + if(back_overlay) //This is faster fuck you + apply_overlay(BACK_LAYER) /mob/living/carbon/human/update_inv_legcuffed() remove_overlay(LEGCUFF_LAYER) @@ -768,6 +931,7 @@ in this situation default_icon_file is expected to match either the lefthand_ or ^this female part sucks and will be fully ripped out ideally */ +// Note: if handled_by_bodytype is TRUE before calling this, it makes species use greyscale /obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, override_state = null, override_file = null, datum/species/mob_species = null, direction = null) // WS Edit Start - Worn Icon State diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm index 77b4544a6dbb..3a4506b62562 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm @@ -315,3 +315,102 @@ empulse(src, 5, 8) new /obj/effect/gibspawner/human(get_turf(src)) qdel(src) + +/obj/projectile/tentacle + name = "tentacle" + icon_state = "tentacle_end" + pass_flags = PASSTABLE + damage = 0 + damage_type = BRUTE + range = 8 + hitsound = 'sound/weapons/thudswoosh.ogg' + var/chain + +/obj/projectile/tentacle/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE) + ..() + +/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) + if(H.throw_mode) + H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item + +/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C) + if(H.Adjacent(C)) + if(H.get_active_held_item() && !H.get_inactive_held_item()) + H.swap_hand() + if(H.get_active_held_item()) + return + C.grabbedby(H) + C.grippedby(H, instant = TRUE) //instant aggro grab + +/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) + if(H.Adjacent(C)) + for(var/obj/item/I in H.held_items) + if(I.get_sharpness()) + C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!") + C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST) + H.do_item_attack_animation(C, used_item = I) + H.add_mob_blood(C) + playsound(get_turf(H),I.hitsound,75,TRUE) + return + +/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) + var/mob/living/carbon/human/H = firer + if(blocked >= 100) + return BULLET_ACT_BLOCK + if(isitem(target)) + var/obj/item/I = target + if(!I.anchored) + to_chat(firer, "You pull [I] towards yourself.") + H.throw_mode_on() + I.throw_at(H, 10, 2) + . = BULLET_ACT_HIT + + else if(isliving(target)) + var/mob/living/L = target + if(!L.anchored && !L.throwing)//avoid double hits + if(iscarbon(L)) + var/mob/living/carbon/C = L + var/firer_intent = INTENT_HARM + var/mob/M = firer + if(istype(M)) + firer_intent = M.a_intent + switch(firer_intent) + if(INTENT_HELP) + C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2) + return BULLET_ACT_HIT + + if(INTENT_DISARM) + var/obj/item/I = C.get_active_held_item() + if(I) + if(C.dropItemToGround(I)) + C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") + on_hit(I) //grab the item as if you had hit it directly with the tentacle + return BULLET_ACT_HIT + else + to_chat(firer, "You can't seem to pry [I] off [C]'s hands!") + return BULLET_ACT_BLOCK + else + to_chat(firer, "[C] has nothing in hand to disarm!") + return BULLET_ACT_HIT + + if(INTENT_GRAB) + C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C)) + return BULLET_ACT_HIT + + if(INTENT_HARM) + C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C)) + return BULLET_ACT_HIT + else + L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + L.throw_at(get_step_towards(H,L), 8, 2) + . = BULLET_ACT_HIT + +/obj/projectile/tentacle/Destroy() + qdel(chain) + return ..() + diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index ca595d4d682f..0568533c1e0c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -205,7 +205,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/ranged var/obj/item/gun/TrueGun = null - var/obj/item/gun/magic/Zapstick var/obj/item/gun/ballistic/Pewgun var/obj/item/gun/energy/Zapgun @@ -223,10 +222,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca move_to_delay = 2 * G.w_class + 1 projectilesound = G.fire_sound TrueGun = G - if(istype(G, /obj/item/gun/magic)) - Zapstick = G - var/obj/item/ammo_casing/magic/M = Zapstick.ammo_type - projectiletype = initial(M.projectile_type) if(istype(G, /obj/item/gun/ballistic)) Pewgun = G var/obj/item/ammo_box/magazine/M = Pewgun.mag_type @@ -245,11 +240,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca Zapgun.cell.use(shot.e_cost) Zapgun.update_appearance() ..() - else if(Zapstick) - if(Zapstick.charges) - Zapstick.charges-- - Zapstick.update_appearance() - ..() else if(Pewgun) if(Pewgun.chambered) if(Pewgun.chambered.BB) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 3bcd9fa789f7..f21f95692234 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -217,7 +217,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25) // this allows the APC to be embedded in a wall, yet still inside an area if (building) setDir(ndir) - tdir = dir // to fix Vars bug + tdir = dir// to fix Vars bug + switch(tdir) if(NORTH) if((pixel_y != initial(pixel_y)) && (pixel_y != 23)) diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index e38df896bed1..046ae7dbc078 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -4,68 +4,3 @@ projectile_type = /obj/projectile/magic firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic heavy_metal = FALSE - -/obj/item/ammo_casing/magic/change - projectile_type = /obj/projectile/magic/change - -/obj/item/ammo_casing/magic/animate - projectile_type = /obj/projectile/magic/animate - -/obj/item/ammo_casing/magic/heal - projectile_type = /obj/projectile/magic/resurrection - harmful = FALSE - -/obj/item/ammo_casing/magic/death - projectile_type = /obj/projectile/magic/death - -/obj/item/ammo_casing/magic/teleport - projectile_type = /obj/projectile/magic/teleport - harmful = FALSE - -/obj/item/ammo_casing/magic/safety - projectile_type = /obj/projectile/magic/safety - harmful = FALSE - -/obj/item/ammo_casing/magic/door - projectile_type = /obj/projectile/magic/door - harmful = FALSE - -/obj/item/ammo_casing/magic/fireball - projectile_type = /obj/projectile/magic/aoe/fireball - -/obj/item/ammo_casing/magic/chaos - projectile_type = /obj/projectile/magic - -/obj/item/ammo_casing/magic/spellblade - projectile_type = /obj/projectile/magic/spellblade - -/obj/item/ammo_casing/magic/arcane_barrage - projectile_type = /obj/projectile/magic/arcane_barrage - -/obj/item/ammo_casing/magic/honk - projectile_type = /obj/projectile/bullet/honker - -/obj/item/ammo_casing/magic/locker - projectile_type = /obj/projectile/magic/locker - -/obj/item/ammo_casing/magic/flying - projectile_type = /obj/projectile/magic/flying - -/obj/item/ammo_casing/magic/bounty - projectile_type = /obj/projectile/magic/bounty - -/obj/item/ammo_casing/magic/antimagic - projectile_type = /obj/projectile/magic/antimagic - -/obj/item/ammo_casing/magic/sapping - projectile_type = /obj/projectile/magic/sapping - -/obj/item/ammo_casing/magic/necropotence - projectile_type = /obj/projectile/magic/necropotence - -/obj/item/ammo_casing/magic/wipe - projectile_type = /obj/projectile/magic/wipe - -/obj/item/ammo_casing/magic/nothing - projectile_type = /obj/projectile/magic/nothing - harmful = FALSE diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm index 1d4316560e92..55b749ac3333 100644 --- a/code/modules/projectiles/boxes_magazines/internal/misc.dm +++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm @@ -1,9 +1,3 @@ -/obj/item/ammo_box/magazine/internal/hook - name = "hook internal tube" - ammo_type = /obj/item/ammo_casing/magic/hook - caliber = "hook" - max_ammo = 1 - /obj/item/ammo_box/magazine/internal/bow name = "bowstring" ammo_type = /obj/item/ammo_casing/caseless/arrow diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 921ff98293a1..4f2f8c537958 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -6,13 +6,6 @@ max_ammo = 5 instant_load = TRUE -/obj/item/ammo_box/magazine/internal/boltaction/enchanted - max_ammo = 1 - ammo_type = /obj/item/ammo_casing/a8_50r - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage - /obj/item/ammo_box/magazine/internal/boltaction/solgov name = "SSG-669C internal magazine" ammo_type = /obj/item/ammo_casing/caseless/a858 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9948e8dbf329..3edfd1382cf4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,5 +1,3 @@ -#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 - /obj/item/gun name = "gun" desc = "It's a gun. It's pretty terrible, though." @@ -1099,5 +1097,3 @@ var/safety_prefix = "[our_gun.adjust_fire_select_icon_state_on_safety ? "[our_gun.safety ? "safety_" : ""]" : ""]" button_icon_state = "[safety_prefix][our_gun.fire_select_icon_state_prefix][current_firemode]" return ..() - -#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 160067b6d250..c4d505bcb10c 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -132,23 +132,6 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) default_firemode = FIREMODE_SEMIAUTO -/obj/item/gun/ballistic/automatic/pistol/stickman - name = "flat gun" - desc = "A 2 dimensional gun.. what?" - icon_state = "flatgun" - manufacturer = MANUFACTURER_NONE - -/obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user) - SHOULD_CALL_PARENT(0) - to_chat(user, "As you try to pick up [src], it slips out of your grip..") - if(prob(50)) - to_chat(user, "..and vanishes from your vision! Where the hell did it go?") - qdel(src) - user.update_icons() - else - to_chat(user, "..and falls into view. Whew, that was a close one.") - user.dropItemToGround(src) - /obj/item/gun/ballistic/automatic/pistol/commander name = "\improper Commander" desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm." @@ -281,12 +264,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) to_chat(user, "Theres no magazine to replace!") return -/obj/item/gun/ballistic/automatic/pistol/disposable/pizza - name = "pizza disposable gun" - desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against italians // IF YOU'RE GOING TO DO US DIRTY SPELL IT RIGHT - icon_state = "disposable_pizza" - custom_materials = list(/datum/material/pizza=2000) - //not technically a pistol but whatever /obj/item/gun/ballistic/derringer name = ".38 Derringer" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f39382e81ea2..756a8aa9ca26 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -454,7 +454,6 @@ if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus total_spread += gunslinger_bonus - total_spread = clamp(total_spread,0,INFINITY) return ..(user, total_spread) @@ -679,18 +678,6 @@ EMPTY_GUN_HELPER(revolver/detective) user.apply_damage(300, BRUTE, affecting) user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!") -/obj/item/gun/ballistic/revolver/russian/soul - name = "cursed Russian revolver" - desc = "To play with this revolver requires wagering your very soul." - -/obj/item/gun/ballistic/revolver/russian/soul/shoot_self(mob/living/user) - ..() - var/obj/item/soulstone/anybody/revolver/SS = new /obj/item/soulstone/anybody/revolver(get_turf(src)) - if(!SS.transfer_soul("FORCE", user)) //Something went wrong - qdel(SS) - return - user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!") - /obj/item/gun/ballistic/revolver/firebrand name = "\improper HP Firebrand" desc = "An archaic precursor to revolver-type firearms, this gun was rendered completely obsolete millennia ago. While fast to fire, it is extremely inaccurate. Uses .357 ammo." diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index bdeb7a4811f3..45b1e8b2debd 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -70,10 +70,6 @@ . = ..() . += "The bolt is [bolt_locked ? "open" : "closed"]." -/////////////////////// -// BOLT ACTION RIFLE // -/////////////////////// - /obj/item/gun/ballistic/rifle/illestren name = "\improper HP Illestren" desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, the Illestren is popular among colonists, pirates, snipers, and countless others. Chambered in 8x50mmR." @@ -163,57 +159,6 @@ manufacturer = MANUFACTURER_HUNTERSPRIDE -/obj/item/gun/ballistic/rifle/illestren/enchanted - name = "enchanted bolt-action rifle" - desc = "Careful not to lose your head." - var/guns_left = 30 - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted - can_be_sawn_off = FALSE - manufacturer = MANUFACTURER_NONE - -/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage - name = "arcane barrage" - desc = "Pew Pew Pew." - fire_sound = 'sound/weapons/emitter.ogg' - icon = 'icons/obj/guns/projectile.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - icon_state = "arcane_barrage" - item_state = "arcane_barrage" - slot_flags = null - can_bayonet = FALSE - item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON - flags_1 = NONE - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - -/obj/item/gun/ballistic/rifle/illestren/enchanted/dropped() - . = ..() - guns_left = 0 - -/obj/item/gun/ballistic/rifle/illestren/enchanted/proc/discard_gun(mob/living/user) - user.throw_item(pick(oview(7,get_turf(user)))) - -/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/discard_gun(mob/living/user) - qdel(src) - -/obj/item/gun/ballistic/rifle/illestren/enchanted/attack_self() - return - -/obj/item/gun/ballistic/rifle/illestren/enchanted/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - . = ..() - if(!.) - return - if(guns_left) - var/obj/item/gun/ballistic/rifle/illestren/enchanted/gun = new type - gun.guns_left = guns_left - 1 - discard_gun(user) - user.swap_hand() - user.put_in_hands(gun) - else - user.dropItemToGround(src, TRUE) - /obj/item/gun/ballistic/rifle/polymer name = "polymer survivor rifle" desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout." diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 0029ea9a657c..e36dc8c67b77 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -470,52 +470,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) sawn_off = TRUE slot_flags = ITEM_SLOT_BELT -/obj/item/gun/ballistic/shotgun/doublebarrel/hook - name = "hook modified sawn-off shotgun" - desc = "Range isn't an issue when you can bring your victim to you." - icon_state = "hookshotgun" - icon = 'icons/obj/guns/projectile.dmi' - item_state = "shotgun" - load_sound = 'sound/weapons/gun/shotgun/insert_shell.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty - w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_MEDIUM - can_be_sawn_off = FALSE - force = 16 //it has a hook on it - attack_verb = list("slashed", "hooked", "stabbed") - hitsound = 'sound/weapons/bladeslice.ogg' - //our hook gun! - var/obj/item/gun/magic/hook/bounty/hook - var/toggled = FALSE - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/Initialize() - . = ..() - hook = new /obj/item/gun/magic/hook/bounty(src) - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/AltClick(mob/user) - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - if(toggled) - to_chat(user,"You switch to the shotgun.") - fire_sound = initial(fire_sound) - else - to_chat(user,"You switch to the hook.") - fire_sound = 'sound/weapons/batonextend.ogg' - toggled = !toggled - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/examine(mob/user) - . = ..() - if(toggled) - . += "Alt-click to switch to the shotgun." - else - . += "Alt-click to switch to the hook." - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/afterattack(atom/target, mob/living/user, flag, params) - if(toggled) - hook.afterattack(target, user, flag, params) - else - return ..() - /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact name = "compact compact combat shotgun" desc = "A compact version of the compact version of the semi automatic combat shotgun. For when you want a gun the same size as your brain." diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm deleted file mode 100644 index 1f8be937b645..000000000000 --- a/code/modules/projectiles/guns/magic.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/gun/magic - name = "staff of nothing" - desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years." - icon = 'icons/obj/guns/magic.dmi' - icon_state = "staffofnothing" - item_state = "staff" - lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands - righthand_file = 'icons/mob/inhands/items_righthand.dmi' - fire_sound = 'sound/weapons/emitter.ogg' - flags_1 = CONDUCT_1 - w_class = WEIGHT_CLASS_HUGE - var/checks_antimagic = TRUE - var/max_charges = 6 - var/charges = 0 - var/recharge_rate = 4 - var/charge_tick = 0 - var/can_charge = TRUE - var/ammo_type - var/no_den_usage - trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead - -/obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) - if(no_den_usage) - var/area/A = get_area(user) - if(istype(A, /area/wizard_station)) - add_fingerprint(user) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return - else - no_den_usage = 0 - if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE)) - add_fingerprint(user) - to_chat(user, "Something is interfering with [src].") - return - . = ..() - -/obj/item/gun/magic/can_shoot() - return charges - -/obj/item/gun/magic/recharge_newshot() - if (charges && chambered && !chambered.BB) - chambered.newshot() - -/obj/item/gun/magic/process_chamber(atom/shooter) - if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... - charges--//... drain a charge - recharge_newshot() - -/obj/item/gun/magic/Initialize() - . = ..() - charges = max_charges - if(ammo_type) - chambered = new ammo_type(src) - if(can_charge) - START_PROCESSING(SSobj, src) - - -/obj/item/gun/magic/Destroy() - if(can_charge) - STOP_PROCESSING(SSobj, src) - return ..() - - -/obj/item/gun/magic/process() - if (charges >= max_charges) - charge_tick = 0 - return - charge_tick++ - if(charge_tick < recharge_rate) - return 0 - charge_tick = 0 - charges++ - if(charges == 1) - recharge_newshot() - return 1 - - -/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] whizzles quietly.") - -/obj/item/gun/magic/vv_edit_var(var_name, var_value) - . = ..() - switch(var_name) - if(NAMEOF(src, charges)) - recharge_newshot() diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm deleted file mode 100644 index e8f1683d21a1..000000000000 --- a/code/modules/projectiles/guns/magic/staff.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/item/gun/magic/staff - slot_flags = ITEM_SLOT_BACK - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION - -/obj/item/gun/magic/staff/change - name = "staff of change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/change - icon_state = "staffofchange" - item_state = "staffofchange" - -/obj/item/gun/magic/staff/animate - name = "staff of animation" - desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." - fire_sound = 'sound/magic/staff_animation.ogg' - ammo_type = /obj/item/ammo_casing/magic/animate - icon_state = "staffofanimation" - item_state = "staffofanimation" - -/obj/item/gun/magic/staff/healing - name = "staff of healing" - desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead." - fire_sound = 'sound/magic/staff_healing.ogg' - ammo_type = /obj/item/ammo_casing/magic/heal - icon_state = "staffofhealing" - item_state = "staffofhealing" - -/obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves - return - -/obj/item/gun/magic/staff/chaos - name = "staff of chaos" - desc = "An artefact that spits bolts of chaotic magic that can potentially do anything." - fire_sound = 'sound/magic/staff_chaos.ogg' - ammo_type = /obj/item/ammo_casing/magic/chaos - icon_state = "staffofchaos" - item_state = "staffofchaos" - max_charges = 10 - recharge_rate = 2 - no_den_usage = 1 - var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying, - /obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping, - /obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe) - -/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - chambered.projectile_type = pick(allowed_projectile_types) - . = ..() - -/obj/item/gun/magic/staff/door - name = "staff of door creation" - desc = "An artefact that spits bolts of transformative magic that can create doors in walls." - fire_sound = 'sound/magic/staff_door.ogg' - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "staffofdoor" - item_state = "staffofdoor" - max_charges = 10 - recharge_rate = 2 - no_den_usage = 1 - -/obj/item/gun/magic/staff/honk - name = "staff of the honkmother" - desc = "Honk." - fire_sound = 'sound/items/airhorn.ogg' - ammo_type = /obj/item/ammo_casing/magic/honk - icon_state = "honker" - item_state = "honker" - max_charges = 4 - recharge_rate = 8 - -/obj/item/gun/magic/staff/spellblade - name = "spellblade" - desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword." - fire_sound = 'sound/magic/fireball.ogg' - ammo_type = /obj/item/ammo_casing/magic/spellblade - icon_state = "spellblade" - item_state = "spellblade" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - hitsound = 'sound/weapons/rapierhit.ogg' - force = 20 - armour_penetration = 75 - block_chance = 50 - sharpness = IS_SHARP - max_charges = 4 - -/obj/item/gun/magic/staff/spellblade/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 15, 125, 0, hitsound) - -/obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 - return ..() - -/obj/item/gun/magic/staff/locker - name = "staff of the locker" - desc = "An artefact that expells encapsulating bolts, for incapacitating thy enemy." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/locker - icon_state = "locker" - item_state = "locker" - max_charges = 6 - recharge_rate = 4 - -//yes, they don't have sounds. they're admin staves, and their projectiles will play the chaos bolt sound anyway so why bother? - -/obj/item/gun/magic/staff/flying - name = "staff of flying" - desc = "An artefact that spits bolts of graceful magic that can make something fly." - fire_sound = 'sound/magic/staff_healing.ogg' - ammo_type = /obj/item/ammo_casing/magic/flying - icon_state = "staffofflight" - item_state = "staffofflight" - -/obj/item/gun/magic/staff/sapping - name = "staff of sapping" - desc = "An artefact that spits bolts of sapping magic that can make something sad." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/sapping - icon_state = "staffofsapping" - item_state = "staffofsapping" - -/obj/item/gun/magic/staff/necropotence - name = "staff of necropotence" - desc = "An artefact that spits bolts of death magic that can repurpose the soul." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/necropotence - icon_state = "staffofnecropotence" - item_state = "staffofnecropotence" - -/obj/item/gun/magic/staff/wipe - name = "staff of possession" - desc = "An artefact that spits bolts of mind-unlocking magic that can let ghosts invade the victim's mind." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/wipe - icon_state = "staffofwipe" - item_state = "staffofwipe" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm deleted file mode 100644 index c6a25127878a..000000000000 --- a/code/modules/projectiles/guns/magic/wand.dm +++ /dev/null @@ -1,266 +0,0 @@ -//For use in prob() to determine if an empty wand will shoot once then break. -#define WAND_WREST_CHANCE (1/121) - -/obj/item/gun/magic/wand - name = "wand" - desc = "You shouldn't have this." - ammo_type = /obj/item/ammo_casing/magic - icon_state = "nothingwand" - item_state = "wand" - base_icon_state = "nothingwand" - w_class = WEIGHT_CLASS_SMALL - can_charge = FALSE - max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) - var/variable_charges = TRUE - -/obj/item/gun/magic/wand/Initialize() - if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges - if(prob(33)) - max_charges = CEILING(max_charges / 3, 1) - else - max_charges = CEILING(max_charges / 2, 1) - return ..() - -/obj/item/gun/magic/wand/examine(mob/user) - . = ..() - . += "Has [charges] charge\s remaining." - -/obj/item/gun/magic/wand/update_icon_state() - icon_state = "[base_icon_state][charges ? null : "-drained"]" - return ..() - -/obj/item/gun/magic/wand/attack(atom/target, mob/living/user) - if(target == user) - return - ..() - -/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user) - var/wrested = FALSE - if(!charges) - wrested = shoot_with_empty_chamber(user) - if(!wrested) - return - if(target == user) - if(no_den_usage) - var/area/A = get_area(user) - if(istype(A, /area/wizard_station)) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return - else - no_den_usage = 0 - zap_self(user) - else - . = ..() - if(wrested) - to_chat(user,"[src] overloads and disintegrates.") - qdel(src) - return - update_appearance() - -/obj/item/gun/magic/wand/shoot_with_empty_chamber(mob/living/user) - if(prob(100*WAND_WREST_CHANCE)) - to_chat(user,"You manage to activate [src] one last time.") - charges++ - recharge_newshot() - return TRUE - return ..() - -/obj/item/gun/magic/wand/proc/zap_self(mob/living/user) - user.visible_message("[user] zaps [user.p_them()]self with [src].") - playsound(user, fire_sound, 50, TRUE) - user.log_message("zapped [user.p_them()]self with a [src]", LOG_ATTACK) - - -///////////////////////////////////// -//WAND OF DEATH -///////////////////////////////////// - -/obj/item/gun/magic/wand/death - name = "wand of death" - desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." - fire_sound = 'sound/magic/wandodeath.ogg' - ammo_type = /obj/item/ammo_casing/magic/death - icon_state = "deathwand" - base_icon_state = "deathwand" - max_charges = 3 //3, 2, 2, 1 - -/obj/item/gun/magic/wand/death/zap_self(mob/living/user) - ..() - charges-- - if(user.anti_magic_check()) - user.visible_message("[src] has no effect on [user]!") - return - if(isliving(user)) - var/mob/living/L = user - if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead - user.revive(full_heal = TRUE, admin_revive = TRUE) - to_chat(user, "You feel great!") - return - to_chat(user, "You irradiate yourself with pure negative energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ - ") - user.death(FALSE) - -/obj/item/gun/magic/wand/death/debug - desc = "In some obscure circles, this is known as the 'cloning tester's friend'." - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - - -///////////////////////////////////// -//WAND OF HEALING -///////////////////////////////////// - -/obj/item/gun/magic/wand/resurrection - name = "wand of healing" - desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." - ammo_type = /obj/item/ammo_casing/magic/heal - fire_sound = 'sound/magic/staff_healing.ogg' - icon_state = "revivewand" - base_icon_state = "revivewand" - max_charges = 10 //10, 5, 5, 4 - -/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user) - ..() - charges-- - if(user.anti_magic_check()) - user.visible_message("[src] has no effect on [user]!") - return - if(isliving(user)) - var/mob/living/L = user - if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead - to_chat(user, "You irradiate yourself with pure positive energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ - ") - user.death(0) - return - user.revive(full_heal = TRUE, admin_revive = TRUE) - to_chat(user, "You feel great!") - -/obj/item/gun/magic/wand/resurrection/debug //for testing - desc = "Is it possible for something to be even more powerful than regular magic? This wand is." - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - -///////////////////////////////////// -//WAND OF POLYMORPH -///////////////////////////////////// - -/obj/item/gun/magic/wand/polymorph - name = "wand of polymorph" - desc = "This wand is attuned to chaos and will radically alter the victim's form." - ammo_type = /obj/item/ammo_casing/magic/change - icon_state = "polywand" - base_icon_state = "polywand" - fire_sound = 'sound/magic/staff_change.ogg' - max_charges = 10 //10, 5, 5, 4 - -/obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user) - ..() //because the user mob ceases to exists by the time wabbajack fully resolves - - wabbajack(user) - charges-- - -///////////////////////////////////// -//WAND OF TELEPORTATION -///////////////////////////////////// - -/obj/item/gun/magic/wand/teleport - name = "wand of teleportation" - desc = "This wand will wrench targets through space and time to move them somewhere else." - ammo_type = /obj/item/ammo_casing/magic/teleport - fire_sound = 'sound/magic/wand_teleport.ogg' - icon_state = "telewand" - base_icon_state = "telewand" - max_charges = 10 //10, 5, 5, 4 - no_den_usage = TRUE - -/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user) - if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(3, user.loc) - smoke.start() - charges-- - ..() - -/obj/item/gun/magic/wand/safety - name = "wand of safety" - desc = "This wand will use the lightest of bluespace currents to gently place the target somewhere safe." - ammo_type = /obj/item/ammo_casing/magic/safety - fire_sound = 'sound/magic/wand_teleport.ogg' - icon_state = "telewand" - base_icon_state = "telewand" - max_charges = 10 //10, 5, 5, 4 - no_den_usage = FALSE - -/obj/item/gun/magic/wand/safety/zap_self(mob/living/user) - var/turf/origin = get_turf(user) - var/turf/destination = find_safe_turf() - - if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC)) - for(var/t in list(origin, destination)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) - smoke.start() - ..() - -/obj/item/gun/magic/wand/safety/debug - desc = "This wand has 'find_safe_turf()' engraved into its blue wood. Perhaps it's a secret message?" - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - - -///////////////////////////////////// -//WAND OF DOOR CREATION -///////////////////////////////////// - -/obj/item/gun/magic/wand/door - name = "wand of door creation" - desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "doorwand" - base_icon_state = "doorwand" - fire_sound = 'sound/magic/staff_door.ogg' - max_charges = 20 //20, 10, 10, 7 - no_den_usage = 1 - -/obj/item/gun/magic/wand/door/zap_self(mob/living/user) - to_chat(user, "You feel vaguely more open with your feelings.") - charges-- - ..() - -///////////////////////////////////// -//WAND OF FIREBALL -///////////////////////////////////// - -/obj/item/gun/magic/wand/fireball - name = "wand of fireball" - desc = "This wand shoots scorching balls of fire that explode into destructive flames." - fire_sound = 'sound/magic/fireball.ogg' - ammo_type = /obj/item/ammo_casing/magic/fireball - icon_state = "firewand" - base_icon_state = "firewand" - max_charges = 8 //8, 4, 4, 3 - -/obj/item/gun/magic/wand/fireball/zap_self(mob/living/user) - ..() - explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - charges-- - -///////////////////////////////////// -//WAND OF NOTHING -///////////////////////////////////// - -/obj/item/gun/magic/wand/nothing - name = "wand of nothing" - desc = "It's not just a stick, it's a MAGIC stick?" - ammo_type = /obj/item/ammo_casing/magic/nothing - - -#undef WAND_WREST_CHANCE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 829393d4d115..0b9bcb8da4f7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1,7 +1,3 @@ - -#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. -#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. - /obj/projectile name = "projectile" icon = 'icons/obj/projectiles.dmi' diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm deleted file mode 100644 index 6ca85ca933ec..000000000000 --- a/code/modules/projectiles/projectile/magic.dm +++ /dev/null @@ -1,734 +0,0 @@ -/obj/projectile/magic - name = "bolt" - icon_state = "energy" - damage = 0 - damage_type = OXY - nodamage = TRUE - armour_penetration = 100 - flag = "magic" - -/obj/projectile/magic/death - name = "bolt of death" - icon_state = "pulse1_bl" - -/obj/projectile/magic/death/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - if(isliving(M)) - var/mob/living/L = M - if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead - if(L.hellbound && L.stat == DEAD) - return BULLET_ACT_BLOCK - if(L.revive(full_heal = TRUE, admin_revive = TRUE)) - L.grab_ghost(force = TRUE) - to_chat(L, "You rise with a start, you're undead!!!") - else if(L.stat != DEAD) - to_chat(L, "You feel great!") - else - L.death(0) - else - M.death(0) - -/obj/projectile/magic/resurrection - name = "bolt of resurrection" - icon_state = "ion" - damage = 0 - damage_type = OXY - nodamage = TRUE - -/obj/projectile/magic/resurrection/on_hit(mob/living/carbon/target) - . = ..() - if(isliving(target)) - if(target.anti_magic_check()) - target.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead - target.death(0) - else - if(target.hellbound && target.stat == DEAD) - return BULLET_ACT_BLOCK - if(target.revive(full_heal = TRUE, admin_revive = TRUE)) - target.grab_ghost(force = TRUE) // even suicides - to_chat(target, "You rise with a start, you're alive!!!") - else if(target.stat != DEAD) - to_chat(target, "You feel great!") - -/obj/projectile/magic/teleport - name = "bolt of teleportation" - icon_state = "bluespace" - damage = 0 - damage_type = OXY - nodamage = TRUE - var/inner_tele_radius = 0 - var/outer_tele_radius = 6 - -/obj/projectile/magic/teleport/on_hit(mob/target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [target]!") - return BULLET_ACT_BLOCK - var/teleammount = 0 - var/teleloc = target - if(!isturf(target)) - teleloc = target.loc - for(var/atom/movable/stuff in teleloc) - if(!stuff.anchored && stuff.loc && !isobserver(stuff)) - if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC)) - teleammount++ - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity - smoke.start() - -/obj/projectile/magic/safety - name = "bolt of safety" - icon_state = "bluespace" - damage = 0 - damage_type = OXY - nodamage = TRUE - -/obj/projectile/magic/safety/on_hit(atom/target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [target]!") - return BULLET_ACT_BLOCK - if(isturf(target)) - return BULLET_ACT_HIT - - var/turf/origin_turf = get_turf(target) - var/turf/destination_turf = find_safe_turf() - - if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC)) - for(var/t in list(origin_turf, destination_turf)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) - smoke.start() - -/obj/projectile/magic/door - name = "bolt of door creation" - icon_state = "energy" - damage = 0 - damage_type = OXY - nodamage = TRUE - var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond) - -/obj/projectile/magic/door/on_hit(atom/target) - . = ..() - if(istype(target, /obj/machinery/door)) - OpenDoor(target) - else - var/turf/T = get_turf(target) - if(isclosedturf(T) && !isindestructiblewall(T)) - CreateDoor(T) - -/obj/projectile/magic/door/proc/CreateDoor(turf/T) - var/door_type = pick(door_types) - var/obj/structure/mineral_door/D = new door_type(T) - T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - D.Open() - -/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D) - if(istype(D, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = D - A.locked = FALSE - D.open() - -/obj/projectile/magic/change - name = "bolt of change" - icon_state = "ice_1" - damage = 0 - damage_type = BURN - nodamage = TRUE - -/obj/projectile/magic/change/on_hit(atom/change) - . = ..() - if(ismob(change)) - var/mob/M = change - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [M]!") - qdel(src) - return BULLET_ACT_BLOCK - wabbajack(change) - qdel(src) - -/proc/wabbajack(mob/living/M) - if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags)) - return - - M.notransform = TRUE - ADD_TRAIT(M, TRAIT_IMMOBILIZED, MAGIC_TRAIT) - ADD_TRAIT(M, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT) - M.icon = null - M.cut_overlays() - M.invisibility = INVISIBILITY_ABSTRACT - - var/list/contents = M.contents.Copy() - - if(iscyborg(M)) - var/mob/living/silicon/robot/Robot = M - // Disconnect AI's in shells - if(Robot.connected_ai) - Robot.connected_ai.disconnect_shell() - if(Robot.mmi) - qdel(Robot.mmi) - Robot.notify_ai(NEW_BORG) - else - for(var/obj/item/W in contents) - if(!M.dropItemToGround(W)) - qdel(W) - - var/mob/living/new_mob - - var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal") - switch(randomize) - if("monkey") - new_mob = new /mob/living/carbon/monkey(M.loc) - - if("robot") - var/robot = pick(200;/mob/living/silicon/robot, - /mob/living/silicon/robot/modules/syndicate, - /mob/living/silicon/robot/modules/syndicate/medical, - /mob/living/silicon/robot/modules/syndicate/saboteur, - 200;/mob/living/simple_animal/drone/polymorphed) - new_mob = new robot(M.loc) - if(issilicon(new_mob)) - new_mob.gender = M.gender - new_mob.invisibility = 0 - new_mob.job = "Cyborg" - var/mob/living/silicon/robot/Robot = new_mob - Robot.lawupdate = FALSE - Robot.connected_ai = null - Robot.mmi.transfer_identity(M) //Does not transfer key/client. - Robot.clear_inherent_laws(0) - Robot.clear_zeroth_law(0) - - if("slime") - new_mob = new /mob/living/simple_animal/slime/random(M.loc) - - if("xeno") - var/Xe - if(M.ckey) - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel) - else - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel) - new_mob = new Xe(M.loc) - - if("animal") - var/path = pick(/mob/living/simple_animal/hostile/carp, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/statue, - /mob/living/simple_animal/hostile/retaliate/bat, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/hostile/killertomato, - /mob/living/simple_animal/hostile/poison/giant_spider, - /mob/living/simple_animal/hostile/poison/giant_spider/hunter, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/carp/ranged, - /mob/living/simple_animal/hostile/carp/ranged/chaos, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/headcrab, - /mob/living/simple_animal/hostile/morph, - /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/gorilla, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/pet/dog/corgi, - /mob/living/simple_animal/crab, - /mob/living/simple_animal/pet/dog/pug, - /mob/living/simple_animal/pet/cat, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/chicken, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/lizard, - /mob/living/simple_animal/pet/fox, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/pet/cat/cak, - /mob/living/simple_animal/chick) - new_mob = new path(M.loc) - - if("humanoid") - new_mob = new /mob/living/carbon/human(M.loc) - - if(prob(50)) - var/list/chooseable_races = list() - for(var/speciestype in subtypesof(/datum/species)) - var/datum/species/S = speciestype - if(initial(S.changesource_flags) & WABBAJACK) - chooseable_races += speciestype - - if(chooseable_races.len) - new_mob.set_species(pick(chooseable_races)) - - var/datum/preferences/A = new() //Randomize appearance for the human - A.copy_to(new_mob, icon_updates=0) - - var/mob/living/carbon/human/H = new_mob - H.update_hair() - H.update_body_parts(TRUE) - H.dna.update_dna_identity() - - if(!new_mob) - return - - // Some forms can still wear some items - for(var/obj/item/W in contents) - new_mob.equip_to_appropriate_slot(W) - - M.log_message("became [new_mob.real_name]", LOG_ATTACK, color="orange") - - new_mob.a_intent = INTENT_HARM - - M.wabbajack_act(new_mob) - - to_chat(new_mob, "Your form morphs into that of a [randomize].") - - var/poly_msg = get_policy(POLICY_POLYMORPH) - if(poly_msg) - to_chat(new_mob, poly_msg) - - M.transfer_observers_to(new_mob) - - qdel(M) - return new_mob - -/obj/projectile/magic/animate - name = "bolt of animation" - icon_state = "red_1" - damage = 0 - damage_type = BURN - nodamage = TRUE - -/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE) - target.animate_atom_living(firer) - ..() - -/atom/proc/animate_atom_living(mob/living/owner = null) - if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.protected_objects)) - if(istype(src, /obj/structure/statue/petrified)) - var/obj/structure/statue/petrified/P = src - if(P.petrified_mob) - var/mob/living/L = P.petrified_mob - var/mob/living/simple_animal/hostile/statue/S = new(P.loc, owner) - S.name = "statue of [L.name]" - if(owner) - S.faction = list("[REF(owner)]") - S.icon = P.icon - S.icon_state = P.icon_state - S.copy_overlays(P, TRUE) - S.color = P.color - S.atom_colours = P.atom_colours.Copy() - if(L.mind) - L.mind.transfer_to(S) - if(owner) - to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") - P.forceMove(S) - return - else - var/obj/O = src - if(istype(O, /obj/item/gun)) - new /mob/living/simple_animal/hostile/mimic/copy/ranged(loc, src, owner) - else - new /mob/living/simple_animal/hostile/mimic/copy(loc, src, owner) - - else if(istype(src, /mob/living/simple_animal/hostile/mimic/copy)) - // Change our allegiance! - var/mob/living/simple_animal/hostile/mimic/copy/C = src - if(owner) - C.ChangeOwner(owner) - -/obj/projectile/magic/spellblade - name = "blade energy" - icon_state = "lavastaff" - damage = 15 - damage_type = BURN - flag = "magic" - dismemberment = 50 - nodamage = FALSE - -/obj/projectile/magic/spellblade/on_hit(target) - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - . = ..() - -/obj/projectile/magic/arcane_barrage - name = "arcane bolt" - icon_state = "arcane_barrage" - damage = 20 - damage_type = BURN - nodamage = FALSE - armour_penetration = 0 - flag = "magic" - hitsound = 'sound/weapons/barragespellhit.ogg' - -/obj/projectile/magic/arcane_barrage/on_hit(target) - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - . = ..() - - -/obj/projectile/magic/locker - name = "locker bolt" - icon_state = "locker" - nodamage = TRUE - flag = "magic" - var/weld = TRUE - var/created = FALSE //prevents creation of more then one locker if it has multiple hits - var/locker_suck = TRUE - var/obj/structure/closet/locker_temp_instance = /obj/structure/closet/decay - -/obj/projectile/magic/locker/Initialize() - . = ..() - locker_temp_instance = new(src) - -/obj/projectile/magic/locker/prehit_pierce(atom/A) - . = ..() - if(isliving(A) && locker_suck) - var/mob/living/M = A - if(M.anti_magic_check()) // no this doesn't check if ..() returned to phase through do I care no it's magic ain't gotta explain shit - M.visible_message("[src] vanishes on contact with [A]!") - return PROJECTILE_DELETE_WITHOUT_HITTING - if(!locker_temp_instance.insertion_allowed(M)) - return - M.forceMove(src) - return PROJECTILE_PIERCE_PHASE - -/obj/projectile/magic/locker/on_hit(target) - if(created) - return ..() - if(LAZYLEN(contents)) - for(var/atom/movable/AM in contents) - locker_temp_instance.insert(AM) - locker_temp_instance.welded = weld - locker_temp_instance.update_appearance() - created = TRUE - return ..() - -/obj/projectile/magic/locker/Destroy() - locker_suck = FALSE - RemoveElement(/datum/element/connect_loc, projectile_connections) //We do this manually so the forcemoves don't "hit" us. This behavior is kinda dumb, someone refactor this - for(var/atom/movable/AM in contents) - AM.forceMove(get_turf(src)) - . = ..() - -/obj/structure/closet/decay - breakout_time = 600 - icon_welded = null - var/magic_icon = "cursed" - var/weakened_icon = "decursed" - var/auto_destroy = TRUE - -/obj/structure/closet/decay/Initialize() - . = ..() - if(auto_destroy) - addtimer(CALLBACK(src, PROC_REF(bust_open)), 5 MINUTES) - addtimer(CALLBACK(src, PROC_REF(magicly_lock)), 5) - -/obj/structure/closet/decay/proc/magicly_lock() - if(!welded) - return - icon_state = magic_icon - update_appearance() - -/obj/structure/closet/decay/after_weld(weld_state) - if(weld_state) - unmagify() - -/obj/structure/closet/decay/proc/decay() - animate(src, alpha = 0, time = 30) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 30) - -/obj/structure/closet/decay/open(mob/living/user, force = FALSE) - . = ..() - if(.) - if(icon_state == magic_icon) //check if we used the magic icon at all before giving it the lesser magic icon - unmagify() - else - addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS) - -/obj/structure/closet/decay/proc/unmagify() - icon_state = weakened_icon - update_appearance() - addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS) - icon_welded = "welded" - -/obj/projectile/magic/flying - name = "bolt of flying" - icon_state = "flight" - -/obj/projectile/magic/flying/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check()) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - var/atom/throw_target = get_edge_target_turf(L, angle2dir(Angle)) - L.throw_at(throw_target, 200, 4) - -/obj/projectile/magic/bounty - name = "bolt of bounty" - icon_state = "bounty" - -/obj/projectile/magic/bounty/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !firer) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - L.apply_status_effect(STATUS_EFFECT_BOUNTY, firer) - -/obj/projectile/magic/antimagic - name = "bolt of antimagic" - icon_state = "antimagic" - -/obj/projectile/magic/antimagic/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check()) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - L.apply_status_effect(STATUS_EFFECT_ANTIMAGIC) - -/obj/projectile/magic/fetch - name = "bolt of fetching" - icon_state = "fetch" - -/obj/projectile/magic/fetch/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !firer) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - var/atom/throw_target = get_edge_target_turf(L, get_dir(L, firer)) - L.throw_at(throw_target, 200, 4) - -/obj/projectile/magic/sapping - name = "bolt of sapping" - icon_state = "sapping" - -/obj/projectile/magic/sapping/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/sapped) - -/obj/projectile/magic/necropotence - name = "bolt of necropotence" - icon_state = "necropotence" - -/obj/projectile/magic/necropotence/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(L, "Your body feels drained and there is a burning pain in your chest.") - L.maxHealth -= 20 - L.health = min(L.health, L.maxHealth) - if(L.maxHealth <= 0) - to_chat(L, "Your weakened soul is completely consumed by the [src]!") - L.mind.hasSoul = FALSE - for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - -/obj/projectile/magic/fortify - name = "bolt of light" - icon_state = "spark" - -/obj/projectile/magic/fortify/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(L, "You feel your body flood with magical strength! Your flesh feels cleansed, and somehow... tougher.") - L.maxHealth += 20 - L.heal_overall_damage(20, 20) - L.apply_damage(-200, CLONE)//cleanses cellular damage - if(L.mind.hasSoul == FALSE)//restores consumed souls - to_chat(L, "You feel a warm light in your chest... the [src] has restored something you'd long forgotten.") - L.mind.hasSoul = TRUE - if(L.hellbound == 1) - L.hellbound = 0//devil economy in shambles - for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - -/obj/projectile/magic/wipe - name = "bolt of possession" - icon_state = "wipe" - -/obj/projectile/magic/wipe/on_hit(target) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - for(var/x in M.get_traumas())//checks to see if the victim is already going through possession - if(istype(x, /datum/brain_trauma/special/imaginary_friend/trapped_owner)) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(M, "Your mind has been opened to possession!") - possession_test(M) - return BULLET_ACT_HIT - -/obj/projectile/magic/wipe/proc/possession_test(mob/living/carbon/M) - var/datum/brain_trauma/special/imaginary_friend/trapped_owner/trauma = M.gain_trauma(/datum/brain_trauma/special/imaginary_friend/trapped_owner) - var/poll_message = "Do you want to play as [M.real_name]?" - if(M.mind && M.mind.assigned_role) - poll_message = "[poll_message] Job:[M.mind.assigned_role]." - if(M.mind && M.mind.special_role) - poll_message = "[poll_message] Status:[M.mind.special_role]." - else if(M.mind) - var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/) - if(A) - poll_message = "[poll_message] Status:[A.name]." - var/list/mob/dead/observer/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M) - if(M.stat == DEAD)//boo. - return - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - to_chat(M, "You have been noticed by a ghost and it has possessed you!") - var/oldkey = M.key - M.ghostize(0) - M.key = C.key - trauma.friend.key = oldkey - trauma.friend.reset_perspective(null) - trauma.friend.Show() - trauma.friend_initialized = TRUE - else - to_chat(M, "Your mind has managed to go unnoticed in the spirit world.") - qdel(trauma) - -/obj/projectile/magic/aoe - name = "Area Bolt" - desc = "What the fuck does this do?!" - damage = 0 - var/proxdet = TRUE - -/obj/projectile/magic/aoe/Range() - if(proxdet) - for(var/mob/living/L in range(1, get_turf(src))) - if(L.stat != DEAD && L != firer && !L.anti_magic_check()) - return Bump(L) - ..() - - -/obj/projectile/magic/aoe/lightning - name = "lightning bolt" - icon_state = "tesla_projectile" //Better sprites are REALLY needed and appreciated!~ - damage = 15 - damage_type = BURN - nodamage = FALSE - speed = 0.3 - flag = "magic" - - var/zap_power = 20000 - var/zap_range = 15 - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE - var/chain - var/mob/living/caster - -/obj/projectile/magic/aoe/lightning/fire(setAngle) - if(caster) - chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() - -/obj/projectile/magic/aoe/lightning/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - visible_message("[src] fizzles on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - tesla_zap(src, zap_range, zap_power, zap_flags) - qdel(src) - -/obj/projectile/magic/aoe/lightning/Destroy() - qdel(chain) - . = ..() - -/obj/projectile/magic/aoe/fireball - name = "bolt of fireball" - icon_state = "fireball" - damage = 10 - damage_type = BRUTE - nodamage = FALSE - - //explosion values - var/exp_heavy = 0 - var/exp_light = 2 - var/exp_flash = 3 - var/exp_fire = 2 - -/obj/projectile/magic/aoe/fireball/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/living/M = target - if(M.anti_magic_check()) - visible_message("[src] vanishes into smoke on contact with [target]!") - return BULLET_ACT_BLOCK - M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately - var/turf/T = get_turf(target) - explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire) - -/obj/projectile/magic/aoe/fireball/infernal - name = "infernal fireball" - exp_heavy = -1 - exp_light = -1 - exp_flash = 4 - exp_fire= 5 - -/obj/projectile/magic/aoe/fireball/infernal/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/living/M = target - if(M.anti_magic_check()) - return BULLET_ACT_BLOCK - var/turf/T = get_turf(target) - for(var/i=0, i<50, i+=10) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i) - -//still magic related, but a different path - -/obj/projectile/temp/chill - name = "bolt of chills" - icon_state = "ice_2" - damage = 0 - damage_type = BURN - nodamage = FALSE - armour_penetration = 100 - temperature = -200 // Cools you down greatly per hit - flag = "magic" - -/obj/projectile/magic/nothing - name = "bolt of nothing" diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm deleted file mode 100644 index 464586d2f8a4..000000000000 --- a/code/modules/projectiles/projectile/magic/spellcard.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/projectile/spellcard - name = "enchanted card" - desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one." - icon_state = "spellcard" - damage_type = BURN - damage = 2 diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 9bdc513289e1..5e45c756c881 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -138,16 +138,15 @@ other types of metals and chemistry for reagents). blueprints[1] = new /datum/design/c10mm() -/obj/item/disk/design_disk/adv/disposable_gun +/obj/item/disk/design_disk/disposable_gun name = "design disk - disposable gun" desc = "A design disk containing designs for a cheap and disposable gun." illustration = "gun" max_blueprints = 2 -/obj/item/disk/design_disk/adv/disposable_gun/Initialize() +/obj/item/disk/design_disk/disposable_gun/Initialize() . = ..() blueprints[1] = new /datum/design/disposable_gun() - blueprints[2] = new /datum/design/pizza_disposable_gun() /obj/item/disk/design_disk/clip_mechs name = "design disk - CLIP mecha modifications" diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 5edbb4df1158..45d65ebf0753 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -650,14 +650,6 @@ build_path = /obj/item/gun/ballistic/automatic/pistol/disposable category = list("Imported") -/datum/design/pizza_disposable_gun - name = "Pizza Disposable Gun" - id = "disposable_pizza" - build_type = AUTOLATHE - materials = list(/datum/material/pizza = 4000) - build_path = /obj/item/gun/ballistic/automatic/pistol/disposable/pizza - category = list("Imported") - //SRM Ballistics /datum/design/doublebarrel name = "Double Barrel Shotgun" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 9016d60515e7..ce473ad739cb 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -355,16 +355,6 @@ C.name = "Cup of Suspicious Liquid" C.desc = "It has a large hazard symbol printed on the side in fading ink." investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR) - else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - var/turf/start = get_turf(src) - var/mob/M = locate(/mob/living) in view(src, 3) - var/turf/MT = get_turf(M) - if(MT) - visible_message("[src] dangerously overheats, launching a flaming fuel orb!") - investigate_log("Experimentor has launched a fireball at [M]!", INVESTIGATE_EXPERIMENTOR) - var/obj/projectile/magic/aoe/fireball/FB = new /obj/projectile/magic/aoe/fireball(start) - FB.preparePixelProjectile(MT, start) - FB.fire() else if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!") explosion(loc, -1, 0, 0, 0, 0, flame_range = 2) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 29ea3fbd4298..ac663059d0c0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -65,54 +65,3 @@ Slimecrossing Weapons /obj/item/shield/adamantineshield/ComponentInitialize() . = ..() AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15) - -//Bloodchiller - Chilling Green -/obj/item/gun/magic/bloodchill - name = "blood chiller" - desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "bloodgun" - item_state = "bloodgun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - item_flags = ABSTRACT | DROPDEL - w_class = WEIGHT_CLASS_HUGE - slot_flags = NONE - force = 5 - max_charges = 1 //Recharging costs blood. - recharge_rate = 1 - ammo_type = /obj/item/ammo_casing/magic/bloodchill - fire_sound = 'sound/effects/attackblob.ogg' - -/obj/item/gun/magic/bloodchill/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) - -/obj/item/gun/magic/bloodchill/process() - charge_tick++ - if(charge_tick < recharge_rate || charges >= max_charges) - return 0 - charge_tick = 0 - var/mob/living/M = loc - if(istype(M) && M.blood_volume >= 20) - charges++ - M.blood_volume -= 20 - if(charges == 1) - recharge_newshot() - return 1 - -/obj/item/ammo_casing/magic/bloodchill - projectile_type = /obj/projectile/magic/bloodchill - -/obj/projectile/magic/bloodchill - name = "blood ball" - icon_state = "pulse0_bl" - damage = 0 - damage_type = OXY - nodamage = TRUE - hitsound = 'sound/effects/splat.ogg' - -/obj/projectile/magic/bloodchill/on_hit(mob/living/target) - . = ..() - if(isliving(target)) - target.apply_status_effect(/datum/status_effect/bloodchill) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 89fa16cca7f5..9fe7857c073b 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -235,29 +235,6 @@ Chilling extracts: user.visible_message("[src] lets out a peaceful ring as it shatters, but nothing happens...") ..() -/obj/item/slimecross/chilling/green - colour = "green" - effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo." - -/obj/item/slimecross/chilling/green/do_effect(mob/user) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - var/mob/living/L = user - if(!istype(user)) - return - var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case... - L.dropItemToGround(held) - var/obj/item/gun/magic/bloodchill/gun = new(user) - if(!L.put_in_hands(gun)) - qdel(gun) - user.visible_message("[src] flash-freezes [user]'s arm, cracking the flesh horribly!") - else - user.visible_message("[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!") - user.emote("scream") - L.apply_damage(30,BURN,which_hand) - ..() - /obj/item/slimecross/chilling/pink colour = "pink" effect_desc = "Creates a slime corgi puppy." diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm deleted file mode 100644 index dd4d39e91a20..000000000000 --- a/code/modules/ruins/icemoonruin_code/hotsprings.dm +++ /dev/null @@ -1,56 +0,0 @@ -GLOBAL_LIST_EMPTY(cursed_minds) - -/** - * Turns whoever enters into a mob or random person - * - * If mob is chosen, turns the person into a random animal type - * If appearance is chosen, turns the person into a random human with a random species - * This changes name, and changes their DNA as well - * Random species is same as wizard swap event so people don't get killed ex: plasmamen - * Once the spring is used, it cannot be used by the same mind ever again - * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere) - * - */ - -/turf/open/water/cursed_spring - baseturfs = /turf/open/water/cursed_spring - planetary_atmos = TRUE - initial_gas_mix = ICEMOON_DEFAULT_ATMOS - -/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc) - . = ..() - if(!isliving(thing)) - return - var/mob/living/L = thing - if(!L.client) - return - if(GLOB.cursed_minds[L.mind]) - return - GLOB.cursed_minds[L.mind] = TRUE - RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_cursed)) - var/random_choice = pick("Mob", "Appearance") - switch(random_choice) - if("Mob") - L = wabbajack(L, "animal") - if("Appearance") - var/mob/living/carbon/human/H = wabbajack(L, "humanoid") - randomize_human(H) - var/list/all_species = list() - for(var/stype in subtypesof(/datum/species)) - var/datum/species/S = stype - if(initial(S.changesource_flags) & RACE_SWAP) - all_species += stype - var/random_race = pick(all_species) - H.set_species(random_race) - H.dna.unique_enzymes = H.dna.generate_unique_enzymes() - L = H - var/turf/T = find_safe_turf() - L.forceMove(T) - to_chat(L, "You blink and find yourself in [get_area_name(T)].") - -/** - * Deletes minds from the cursed minds list after their deletion - * - */ -/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M) - GLOB.cursed_minds -= M diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 2603d9ea3e24..1ddb26efba88 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -1,134 +1,5 @@ // Special objects for shuttle templates go here if nowhere else -// Wabbajack statue, a sleeping frog statue that shoots bolts of change if -// living carbons are put on its altar/tables - -/obj/machinery/power/emitter/energycannon/magical - name = "wabbajack statue" - desc = "Who am I? What is my purpose in life? What do I mean by who am I?" - projectile_type = /obj/projectile/magic/change - icon = 'icons/obj/machines/magic_emitter.dmi' - icon_state = "wabbajack_statue" - icon_state_on = "wabbajack_statue_on" - base_icon_state = "wabbajack_statue" - active = FALSE - allow_switch_interact = FALSE - var/list/active_tables = list() - var/tables_required = 2 - -/obj/machinery/power/emitter/energycannon/magical/Initialize() - . = ..() - if(prob(50)) - desc = "Oh no, not again." - update_appearance() - -/obj/machinery/power/emitter/energycannon/magical/update_icon_state() - . = ..() - icon_state = active ? icon_state_on : initial(icon_state) - -/obj/machinery/power/emitter/energycannon/magical/process() - . = ..() - if(active_tables.len >= tables_required) - if(!active) - visible_message("\ - [src] opens its eyes.") - active = TRUE - else - if(active) - visible_message("\ - [src] closes its eyes.") - active = FALSE - update_appearance() - -/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params) - return - -/obj/machinery/power/emitter/energycannon/magical/ex_act(severity) - return - -/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user) - return - -/obj/structure/table/abductor/wabbajack - name = "wabbajack altar" - desc = "Whether you're sleeping or waking, it's going to be quite chaotic." - max_integrity = 1000 - verb_say = "chants" - var/obj/machinery/power/emitter/energycannon/magical/our_statue - var/list/mob/living/sleepers = list() - var/never_spoken = TRUE - flags_1 = NODECONSTRUCT_1 - -/obj/structure/table/abductor/wabbajack/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/structure/table/abductor/wabbajack/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/table/abductor/wabbajack/process() - var/area = orange(4, src) - if(!our_statue) - for(var/obj/machinery/power/emitter/energycannon/magical/M in area) - our_statue = M - break - - if(!our_statue) - name = "inert [initial(name)]" - return - else - name = initial(name) - - var/turf/T = get_turf(src) - var/list/found = list() - for(var/mob/living/carbon/C in T) - if(C.stat != DEAD) - found += C - - // New sleepers - for(var/i in found - sleepers) - var/mob/living/L = i - L.add_atom_colour("#800080", TEMPORARY_COLOUR_PRIORITY) - L.visible_message("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.", - "[desc]") - // Don't let them sit suround unconscious forever - addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100) - - // Existing sleepers - for(var/i in found) - var/mob/living/L = i - L.SetSleeping(200) - - // Missing sleepers - for(var/i in sleepers - found) - var/mob/living/L = i - L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#800080") - L.visible_message("The glow from [L] fades \ - away.") - L.grab_ghost() - - sleepers = found - - if(sleepers.len) - our_statue.active_tables |= src - if(never_spoken || prob(5)) - say(desc) - never_spoken = FALSE - else - our_statue.active_tables -= src - -/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper) - if(sleeper in sleepers) - to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.") - sleeper.ghostize(TRUE) - -/obj/structure/table/abductor/wabbajack/left - desc = "You sleep so it may wake." - -/obj/structure/table/abductor/wabbajack/right - desc = "It wakes so you may sleep." - // Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks // and a good time. diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 9e30c708774d..46737c5b5a99 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -2,7 +2,7 @@ /obj/effect/proc_holder/spell/aimed name = "aimed projectile spell" base_icon_state = "projectile" - var/projectile_type = /obj/projectile/magic/teleport + var/projectile_type = /obj/projectile var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" var/active_icon_state = "projectile" @@ -106,7 +106,7 @@ projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE) active_msg = "You energize your hands with arcane lightning!" deactive_msg = "You let the energy flow out of your hands back into yourself..." - projectile_type = /obj/projectile/magic/aoe/lightning + projectile_type = /obj/projectile/magic /obj/effect/proc_holder/spell/aimed/fireball name = "Fireball" @@ -118,7 +118,7 @@ invocation_type = INVOCATION_SHOUT range = 20 cooldown_min = 20 //10 deciseconds reduction per rank - projectile_type = /obj/projectile/magic/aoe/fireball + projectile_type = /obj/projectile/magic base_icon_state = "fireball" action_icon_state = "fireball0" sound = 'sound/magic/fireball.ogg' @@ -130,60 +130,3 @@ var/range = 6 + 2*spell_level projectile_var_overrides = list("range" = range) return ..() - -/obj/effect/proc_holder/spell/aimed/spell_cards - name = "Spell Cards" - desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" - school = "evocation" - charge_max = 50 - clothes_req = FALSE - invocation = "Sigi'lu M'Fan 'Tasia" - invocation_type = INVOCATION_SHOUT - range = 40 - cooldown_min = 10 - projectile_amount = 5 - projectiles_per_fire = 7 - projectile_type = /obj/projectile/spellcard - base_icon_state = "spellcard" - action_icon_state = "spellcard0" - var/datum/weakref/current_target_weakref - var/projectile_turnrate = 10 - var/projectile_pixel_homing_spread = 32 - var/projectile_initial_spread_amount = 30 - var/projectile_location_spread_amount = 12 - var/datum/component/lockon_aiming/lockon_component - ranged_clickcd_override = TRUE - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M) - QDEL_NULL(lockon_component) - lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, PROC_REF(on_lockon_component))) - -/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs) - if(!length(locked_weakrefs)) - current_target_weakref = null - return - current_target_weakref = locked_weakrefs[1] - var/atom/A = current_target_weakref.resolve() - if(A) - var/mob/M = lockon_component.parent - M.face_atom(A) - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M) - QDEL_NULL(lockon_component) - -/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - if(current_target_weakref) - var/atom/A = current_target_weakref.resolve() - if(A && get_dist(A, user) < 7) - P.homing_turn_speed = projectile_turnrate - P.homing_inaccuracy_min = projectile_pixel_homing_spread - P.homing_inaccuracy_max = projectile_pixel_homing_spread - P.set_homing_target(current_target_weakref.resolve()) - var/rand_spr = rand() - var/total_angle = projectile_initial_spread_amount * 2 - var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5) - var/one_fire_angle = adjusted_angle / projectiles_per_fire - var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2) - P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.preparePixelProjectile(target, user, null, current_angle) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm index 57325e685f4d..225c36580e49 100644 --- a/code/modules/spells/spell_types/charge.dm +++ b/code/modules/spells/spell_types/charge.dm @@ -51,20 +51,6 @@ I.used = FALSE charged_item = I break - else if(istype(item, /obj/item/gun/magic)) - var/obj/item/gun/magic/I = item - if(prob(80) && !I.can_charge) - I.max_charges-- - if(I.max_charges <= 0) - I.max_charges = 0 - burnt_out = TRUE - I.charges = I.max_charges - if(istype(item, /obj/item/gun/magic/wand) && I.max_charges != 0) - var/obj/item/gun/magic/W = item - W.icon_state = initial(W.icon_state) - I.recharge_newshot() - charged_item = I - break else if(istype(item, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = item if(!C.self_recharge) diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index b7da88dfe790..421b7f40f11c 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -84,7 +84,7 @@ invocation_type = INVOCATION_SHOUT range = 2 - projectile_type = /obj/projectile/magic/aoe/fireball/infernal + projectile_type = /obj/projectile/magic action_background_icon_state = "bg_demon" diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm deleted file mode 100644 index 3f400a8fb4bc..000000000000 --- a/code/modules/spells/spell_types/infinite_guns.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/infinite_guns - name = "Lesser Summon Guns" - desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage." - invocation_type = "none" - include_user = TRUE - range = -1 - - school = "conjuration" - charge_max = 750 - clothes_req = TRUE - cooldown_min = 10 //Gun wizard - action_icon_state = "bolt_action" - var/summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted - -/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr) - for(var/mob/living/carbon/C in targets) - C.drop_all_held_items() - var/GUN = new summon_path - C.put_in_hands(GUN) - -/obj/effect/proc_holder/spell/targeted/infinite_guns/gun - -/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - name = "Arcane Barrage" - desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun." - action_icon_state = "arcane_barrage" - summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index e79ffb8a491e..ed6d9a9b957d 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -49,60 +49,8 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/energy/laser/scatter, /obj/item/gun/energy/gravity_gun)) -//if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types -GLOBAL_LIST_INIT(summoned_magic, list( - /obj/item/book/granter/spell/fireball, - /obj/item/book/granter/spell/smoke, - /obj/item/book/granter/spell/blind, - /obj/item/book/granter/spell/mindswap, - /obj/item/book/granter/spell/forcewall, - /obj/item/book/granter/spell/knock, - /obj/item/book/granter/spell/barnyard, - /obj/item/book/granter/spell/charge, - /obj/item/book/granter/spell/summonitem, - /obj/item/gun/magic/wand/nothing, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/resurrection, - /obj/item/gun/magic/wand/polymorph, - /obj/item/gun/magic/wand/teleport, - /obj/item/gun/magic/wand/door, - /obj/item/gun/magic/wand/fireball, - /obj/item/gun/magic/staff/healing, - /obj/item/gun/magic/staff/door, - /obj/item/scrying, - /obj/item/voodoo, - /obj/item/warpwhistle, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword)) - -GLOBAL_LIST_INIT(summoned_special_magic, list( - /obj/item/gun/magic/staff/change, - /obj/item/gun/magic/staff/animate, - /obj/item/storage/belt/wands/full, - /obj/item/antag_spawner/contract, - /obj/item/gun/magic/staff/chaos, - /obj/item/necromantic_stone, - /obj/item/blood_contract)) - -//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways) -GLOBAL_LIST_INIT(summoned_magic_objectives, list( - /obj/item/antag_spawner/contract, - /obj/item/blood_contract, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, - /obj/item/gun/magic, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword, - /obj/item/necromantic_stone, - /obj/item/scrying, - /obj/item/spellbook, - /obj/item/storage/belt/wands/full, - /obj/item/voodoo, - /obj/item/warpwhistle)) - // If true, it's the probability of triggering "survivor" antag. GLOBAL_VAR_INIT(summon_guns_triggered, FALSE) -GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) /proc/give_guns(mob/living/carbon/human/H) if(H.stat == DEAD || !(H.client)) @@ -125,54 +73,19 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) to_chat(H, "\A [G] appears [in_hand ? "in your hand" : "at your feet"]!") -/proc/give_magic(mob/living/carbon/human/H) - if(H.stat == DEAD || !(H.client)) - return - if(H.mind) - if(iswizard(H) || H.mind.has_antag_datum(/datum/antagonist/survivalist/magic)) - return - - if(prob(GLOB.summon_magic_triggered) && !(H.mind.has_antag_datum(/datum/antagonist))) - H.mind.add_antag_datum(/datum/antagonist/survivalist/magic) - H.log_message("was made into a survivalist, and trusts no one!", LOG_ATTACK, color="red") - - var/magic_type = pick(GLOB.summoned_magic) - var/lucky = FALSE - if(prob(SPECIALIST_MAGIC_PROB)) - magic_type = pick(GLOB.summoned_special_magic) - lucky = TRUE - - var/obj/item/M = new magic_type(get_turf(H)) - playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, TRUE) - - var/in_hand = H.put_in_hands(M) - - to_chat(H, "\A [M] appears [in_hand ? "in your hand" : "at your feet"]!") - if(lucky) - to_chat(H, "You feel incredibly lucky.") - - -/proc/rightandwrong(summon_type, mob/user, survivor_probability) - if(user) //in this case either someone holding a spellbook or a badmin - to_chat(user, "You summoned [summon_type]!") - message_admins("[ADMIN_LOOKUPFLW(user)] summoned [summon_type]!") - log_game("[key_name(user)] summoned [summon_type]!") +/proc/rightandwrong(mob/user, survivor_probability) + if(user) //in this case someone is a badmin + to_chat(user, "You summoned guns!") + message_admins("[ADMIN_LOOKUPFLW(user)] summoned guns!") + log_game("[key_name(user)] summoned guns!") - if(summon_type == SUMMON_MAGIC) - GLOB.summon_magic_triggered = survivor_probability - else if(summon_type == SUMMON_GUNS) - GLOB.summon_guns_triggered = survivor_probability - else - CRASH("Bad summon_type given: [summon_type]") + GLOB.summon_guns_triggered = survivor_probability for(var/mob/living/carbon/human/H in GLOB.player_list) var/turf/T = get_turf(H) if(T && is_away_level(T)) continue - if(summon_type == SUMMON_MAGIC) - give_magic(H) - else - give_guns(H) + give_guns(H) /proc/summonevents() if(!SSevents.wizardmode) diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 65eb0cebb2b3..254a43dc23af 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -19,7 +19,6 @@ var/mob/living/shapeshift_type var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ /mob/living/simple_animal/pet/dog/corgi,\ - /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/secbot/ed209,\ /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\ /mob/living/simple_animal/hostile/construct/juggernaut) diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 398d937cc586..61bbb88ab545 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -137,7 +137,6 @@ var/wired = FALSE var/obj/item/stock_parts/cell/cell = null - /obj/item/bodypart/chest/robot/handle_atom_del(atom/A) if(A == cell) cell = null @@ -191,7 +190,6 @@ cell.forceMove(drop_location()) cell = null - /obj/item/bodypart/chest/robot/examine(mob/user) . = ..() if(cell) @@ -214,7 +212,6 @@ cell = null ..() - /obj/item/bodypart/head/robot name = "cyborg head" desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." @@ -304,7 +301,6 @@ to_chat(user, "There is no flash to remove from [src].") return TRUE - /obj/item/bodypart/head/robot/drop_organs(mob/user, violent_removal) if(flash1) flash1.forceMove(user.loc) @@ -314,9 +310,6 @@ flash2 = null ..() - - - /obj/item/bodypart/l_arm/robot/surplus name = "surplus prosthetic left arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 0c200df9f6b1..283ee77971eb 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -149,6 +149,9 @@ /obj/item/organ/eyes/robotic/lizard eye_icon_state = "eyes_synth" +/obj/item/organ/eyes/robotic/kepori + eye_icon_state = "eyes_kepori_synth" + /obj/item/organ/eyes/robotic/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index f58f94df84dd..eaa0a631ec5d 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1712,13 +1712,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/flashlight/lantern/syndicate restricted_species = list("moth") //End WS edit -/datum/uplink_item/race_restricted/syndigenetics - name = "Fire Breath" - desc = "One of our subsidiaries, 23AndMe, have recently found the formula of backtracking lizard's genetic trail and giving them the ability to breathe fire, much like their dragon ancestors." - cost = 5 - item = /obj/item/dnainjector/firebreath - restricted_species = list("lizard") - /datum/uplink_item/race_restricted/razorwing name = "Razorwing Implant" desc = "Put those wings to good use! This implant makes your wingtips razor sharp and gives you the ability to flourish them, slicing anyone in range." diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 04ae257730f2..367c309d59a1 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -112,7 +112,6 @@ /obj/item/gohei = 1, /obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, - /obj/item/gun/magic/wand/nothing = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index 1a993f9a46ac..ee60e5a1fb00 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -131,3 +131,15 @@ - balance: The P16 shoots slightly faster. - balance: Two E-40s max are obtainable from the black market should it spawn. Blank market price cap of the E-40 has also increased +2024-06-08: + Apogee-dev: + - bugfix: fixed an incorrect sprite state on corpo sofas + FalloutFalcon: + - rscdel: Removed alot of magic cruft + - code_imp: Sorts gun defines into there own file + SomeguyManperson: + - bugfix: gunslinger applies its spread reduction effect to revolvers + Sun-Soaked: + - bugfix: removes a comment from apc.dm that was causing strange errors. + thgvr: + - imageadd: Kepori have been given a full visual overhaul. diff --git a/icons/blanks/64x64.dmi b/icons/blanks/64x64.dmi new file mode 100644 index 000000000000..6bfbd471e5db Binary files /dev/null and b/icons/blanks/64x64.dmi differ diff --git a/icons/mob/augmentation/augments_kepori.dmi b/icons/mob/augmentation/augments_kepori.dmi index 56e56dd22db5..e86bdfd9cf2d 100644 Binary files a/icons/mob/augmentation/augments_kepori.dmi and b/icons/mob/augmentation/augments_kepori.dmi differ diff --git a/icons/mob/augmentation/augments_keporiOLD.dmi b/icons/mob/augmentation/augments_keporiOLD.dmi new file mode 100644 index 000000000000..56e56dd22db5 Binary files /dev/null and b/icons/mob/augmentation/augments_keporiOLD.dmi differ diff --git a/icons/mob/clothing/species/kepori.dmi b/icons/mob/clothing/species/kepori.dmi index cfa1f108dc68..1586e80e9b19 100644 Binary files a/icons/mob/clothing/species/kepori.dmi and b/icons/mob/clothing/species/kepori.dmi differ diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi new file mode 100644 index 000000000000..166e1a7624d9 Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi differ diff --git a/icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi similarity index 100% rename from icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi rename to icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi new file mode 100644 index 000000000000..6fe4e042f679 Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi differ diff --git a/icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi similarity index 100% rename from icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi rename to icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi new file mode 100644 index 000000000000..1a6a59cd5241 Binary files /dev/null and b/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi differ diff --git a/icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_torso_keporiOLD.dmi similarity index 100% rename from icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi rename to icons/mob/clothing/underwear/species/kepori/underwear_torso_keporiOLD.dmi diff --git a/icons/mob/kepori_parts.dmi b/icons/mob/kepori_parts.dmi deleted file mode 100644 index 8f9d7e56043e..000000000000 Binary files a/icons/mob/kepori_parts.dmi and /dev/null differ diff --git a/icons/mob/species/kepori/bodyparts.dmi b/icons/mob/species/kepori/bodyparts.dmi index f19aaeacbe08..058d315d7bd8 100644 Binary files a/icons/mob/species/kepori/bodyparts.dmi and b/icons/mob/species/kepori/bodyparts.dmi differ diff --git a/icons/mob/species/kepori/kepori_eyes.dmi b/icons/mob/species/kepori/kepori_eyes.dmi new file mode 100644 index 000000000000..3e1617315755 Binary files /dev/null and b/icons/mob/species/kepori/kepori_eyes.dmi differ diff --git a/icons/mob/species/kepori/kepori_parts.dmi b/icons/mob/species/kepori/kepori_parts.dmi new file mode 100644 index 000000000000..76d1819c9dd8 Binary files /dev/null and b/icons/mob/species/kepori/kepori_parts.dmi differ diff --git a/icons/mob/species/kepori/onmob_belt_kepori.dmi b/icons/mob/species/kepori/onmob_belt_kepori.dmi index cf74d73796c8..4a5a4ba7b32a 100644 Binary files a/icons/mob/species/kepori/onmob_belt_kepori.dmi and b/icons/mob/species/kepori/onmob_belt_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi b/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi new file mode 100644 index 000000000000..cf74d73796c8 Binary files /dev/null and b/icons/mob/species/kepori/onmob_belt_keporiOLD.dmi differ diff --git a/icons/mob/species/kepori/onmob_ears_kepori.dmi b/icons/mob/species/kepori/onmob_ears_kepori.dmi new file mode 100644 index 000000000000..4a5a4ba7b32a Binary files /dev/null and b/icons/mob/species/kepori/onmob_ears_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_eyes_kepori.dmi b/icons/mob/species/kepori/onmob_eyes_kepori.dmi index 2cfe52f4630d..1b6c6f68a3a5 100644 Binary files a/icons/mob/species/kepori/onmob_eyes_kepori.dmi and b/icons/mob/species/kepori/onmob_eyes_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi b/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi new file mode 100644 index 000000000000..2cfe52f4630d Binary files /dev/null and b/icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi differ diff --git a/icons/mob/species/kepori/onmob_feet_kepori.dmi b/icons/mob/species/kepori/onmob_feet_kepori.dmi index 7af39a1f676d..93bb6ee443d5 100644 Binary files a/icons/mob/species/kepori/onmob_feet_kepori.dmi and b/icons/mob/species/kepori/onmob_feet_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi b/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi new file mode 100644 index 000000000000..f352a422378a Binary files /dev/null and b/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi differ diff --git a/icons/mob/species/kepori/onmob_hands_kepori.dmi b/icons/mob/species/kepori/onmob_hands_kepori.dmi index 6dff1607ef57..1cd287411171 100644 Binary files a/icons/mob/species/kepori/onmob_hands_kepori.dmi and b/icons/mob/species/kepori/onmob_hands_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi b/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi new file mode 100644 index 000000000000..6dff1607ef57 Binary files /dev/null and b/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi differ diff --git a/icons/mob/species/kepori/onmob_head_kepori.dmi b/icons/mob/species/kepori/onmob_head_kepori.dmi index 4109e981c603..b4631838b75a 100644 Binary files a/icons/mob/species/kepori/onmob_head_kepori.dmi and b/icons/mob/species/kepori/onmob_head_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_head_keporiOLD.dmi b/icons/mob/species/kepori/onmob_head_keporiOLD.dmi new file mode 100644 index 000000000000..31db76896ba2 Binary files /dev/null and b/icons/mob/species/kepori/onmob_head_keporiOLD.dmi differ diff --git a/icons/mob/species/kepori/onmob_mask_kepori.dmi b/icons/mob/species/kepori/onmob_mask_kepori.dmi index 610c62338c18..d455cf0bd3e5 100644 Binary files a/icons/mob/species/kepori/onmob_mask_kepori.dmi and b/icons/mob/species/kepori/onmob_mask_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi b/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi new file mode 100644 index 000000000000..610c62338c18 Binary files /dev/null and b/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi differ diff --git a/icons/mob/species/kepori/onmob_suit_kepori.dmi b/icons/mob/species/kepori/onmob_suit_kepori.dmi index 4d5eaaab1196..6182a9612547 100644 Binary files a/icons/mob/species/kepori/onmob_suit_kepori.dmi and b/icons/mob/species/kepori/onmob_suit_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi b/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi new file mode 100644 index 000000000000..4d5eaaab1196 Binary files /dev/null and b/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi differ diff --git a/icons/mob/species/kepori/onmob_uniform_kepori.dmi b/icons/mob/species/kepori/onmob_uniform_kepori.dmi index d9bec6e95185..d6f011cef312 100644 Binary files a/icons/mob/species/kepori/onmob_uniform_kepori.dmi and b/icons/mob/species/kepori/onmob_uniform_kepori.dmi differ diff --git a/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi b/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi new file mode 100644 index 000000000000..66fa497129f6 Binary files /dev/null and b/icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi differ diff --git a/icons/obj/structures/chairs/sofa.dmi b/icons/obj/structures/chairs/sofa.dmi index e8cfa4c5509b..17c976e4650e 100644 Binary files a/icons/obj/structures/chairs/sofa.dmi and b/icons/obj/structures/chairs/sofa.dmi differ diff --git a/shiptest.dme b/shiptest.dme index 7f6ce98384c5..06bcfd90a9e0 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1352,7 +1352,6 @@ #include "code\game\objects\structures\fireplace.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\fugitive_role_spawners.dm" #include "code\game\objects\structures\ghost_role_spawners.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -1704,7 +1703,6 @@ #include "code\modules\antagonists\ert\nanotrasen.dm" #include "code\modules\antagonists\ert\solgov.dm" #include "code\modules\antagonists\ert\syndicate.dm" -#include "code\modules\antagonists\fugitive\fugitive_outfits.dm" #include "code\modules\antagonists\gang\outfits.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\magic_servant\servant.dm" @@ -2134,7 +2132,6 @@ #include "code\modules\events\wizard\invincible.dm" #include "code\modules\events\wizard\lava.dm" #include "code\modules\events\wizard\madness.dm" -#include "code\modules\events\wizard\magicarp.dm" #include "code\modules\events\wizard\petsplosion.dm" #include "code\modules\events\wizard\race.dm" #include "code\modules\events\wizard\rpgloot.dm" @@ -3032,7 +3029,6 @@ #include "code\modules\projectiles\guns\ballistic.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\gunhud.dm" -#include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\powered.dm" #include "code\modules\projectiles\guns\ballistic\assault.dm" #include "code\modules\projectiles\guns\ballistic\automatic.dm" @@ -3055,8 +3051,6 @@ #include "code\modules\projectiles\guns\energy\special.dm" #include "code\modules\projectiles\guns\energy\stun.dm" #include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm" -#include "code\modules\projectiles\guns\magic\staff.dm" -#include "code\modules\projectiles\guns\magic\wand.dm" #include "code\modules\projectiles\guns\misc\beam_rifle.dm" #include "code\modules\projectiles\guns\misc\blastcannon.dm" #include "code\modules\projectiles\guns\misc\bow.dm" @@ -3066,7 +3060,6 @@ #include "code\modules\projectiles\guns\misc\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\bullets\_incendiary.dm" #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" #include "code\modules\projectiles\projectile\bullets\dnainjector.dm" @@ -3088,7 +3081,6 @@ #include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" #include "code\modules\projectiles\projectile\energy\stun.dm" #include "code\modules\projectiles\projectile\energy\tesla.dm" -#include "code\modules\projectiles\projectile\magic\spellcard.dm" #include "code\modules\projectiles\projectile\reusable\_reusable.dm" #include "code\modules\projectiles\projectile\reusable\arrow.dm" #include "code\modules\projectiles\projectile\reusable\foam_dart.dm" @@ -3256,7 +3248,6 @@ #include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" #include "code\modules\ruins\lavaland_ruin_code.dm" #include "code\modules\ruins\rockplanet_ruin_code.dm" -#include "code\modules\ruins\icemoonruin_code\hotsprings.dm" #include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm" #include "code\modules\ruins\icemoonruin_code\library.dm" #include "code\modules\ruins\icemoonruin_code\wrath.dm" @@ -3316,7 +3307,6 @@ #include "code\modules\spells\spell_types\forcewall.dm" #include "code\modules\spells\spell_types\genetic.dm" #include "code\modules\spells\spell_types\godhand.dm" -#include "code\modules\spells\spell_types\infinite_guns.dm" #include "code\modules\spells\spell_types\inflict_handler.dm" #include "code\modules\spells\spell_types\knock.dm" #include "code\modules\spells\spell_types\lichdom.dm"