Merge branch 'master' into midnight-fluffles

This commit is contained in:
FlattestGuitar
2017-05-29 15:37:40 +02:00
385 changed files with 2442 additions and 2226 deletions
@@ -35,6 +35,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
log_admin("[key_name(owner)] tried making Traitors with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Traitors with One-Click-Antag")
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_TRAITOR in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_TRAITOR))
@@ -69,6 +72,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
log_admin("[key_name(owner)] tried making Changelings with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Changelings with One-Click-Antag")
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_CHANGELING in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_CHANGELING))
@@ -101,6 +107,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
log_admin("[key_name(owner)] tried making Revolutionaries with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Revolutionaries with One-Click-Antag")
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_REV in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_REV))
@@ -127,6 +136,9 @@ client/proc/one_click_antag()
var/list/candidates = pollCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", "wizard")
log_admin("[key_name(owner)] tried making a Wizard with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making a Wizard with One-Click-Antag")
if(candidates.len)
var/mob/dead/observer/selected = pick(candidates)
candidates -= selected
@@ -146,6 +158,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
log_admin("[key_name(owner)] tried making a Cult with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making a Cult with One-Click-Antag")
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_CULTIST in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_CULTIST))
@@ -177,6 +192,9 @@ client/proc/one_click_antag()
var/mob/theghost = null
var/time_passed = world.time
log_admin("[key_name(owner)] tried making a Nuke Op Team with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making a Nuke Op Team with One-Click-Antag")
for(var/mob/G in respawnable_list)
if(istype(G) && G.client && (ROLE_OPERATIVE in G.client.prefs.be_special))
if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate"))
@@ -265,10 +283,18 @@ client/proc/one_click_antag()
//Abductors
/datum/admins/proc/makeAbductorTeam()
new /datum/event/abductor
log_admin("[key_name(owner)] tried making Abductors with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Abductors with One-Click-Antag")
return 1
/datum/admins/proc/makeAliens()
var/datum/event/alien_infestation/E = new /datum/event/alien_infestation
log_admin("[key_name(owner)] tried making Aliens with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Aliens with One-Click-Antag")
E.spawncount = 3
// TODO The fact we have to do this rather than just have events start
// when we ask them to, is bad.
@@ -289,6 +315,9 @@ client/proc/one_click_antag()
if(prob(10))
input = "Save Runtime and any other cute things on the station."
log_admin("[key_name(owner)] tried making a Death Squad with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making a Death Squad with One-Click-Antag")
var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned.
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
@@ -400,6 +429,9 @@ client/proc/one_click_antag()
var/leader_chosen = 0 //when the leader is chosen. The last person spawned.
log_admin("[key_name(owner)] tried making Vox Raiders with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Vox Raiders with One-Click-Antag")
//Generates a list of candidates from active ghosts.
for(var/mob/G in respawnable_list)
if(istype(G) && G.client && (ROLE_RAIDER in G.client.prefs.be_special))
@@ -502,6 +534,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
log_admin("[key_name(owner)] tried making Vampires with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Vampires with One-Click-Antag")
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_VAMPIRE in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_VAMPIRE))
@@ -533,6 +568,9 @@ client/proc/one_click_antag()
var/mob/theghost = null
var/time_passed = world.time
log_admin("[key_name(owner)] tried making Thunderdome Teams with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making Thunderdone Teams with One-Click-Antag")
//Generates a list of candidates from active ghosts.
for(var/mob/G in respawnable_list)
spawn(0)
-3
View File
@@ -15,9 +15,6 @@
world.tick_lag = newtick
feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
switch(alert("Enable Tick Compensation?","Tick Comp is currently: [config.Tickcomp]","Yes","No"))
if("Yes") config.Tickcomp = 1
else config.Tickcomp = 0
else
to_chat(src, "<span class='warning'>Error: ticklag(): Invalid world.ticklag value. No changes made.</span>")
+2 -2
View File
@@ -67,7 +67,7 @@
throwforce = 0
throw_speed = 1
throw_range = 1
w_class = 1
w_class = WEIGHT_CLASS_TINY
max_amount = 9999 //Dang that's a lot of tickets
/obj/item/stack/tickets/New(var/loc, var/amount=null)
@@ -86,4 +86,4 @@
else if(amount >= 4)
icon_state = "tickets_2"
else
icon_state = "tickets_1"
icon_state = "tickets_1"
+3 -3
View File
@@ -42,9 +42,9 @@
attempt_capture(P, -20) //attempting a melee capture reduces the mob's effective run_chance by 20% to balance the risk of triggering a trap mob
return 1
/obj/effect/nanomob/hitby(obj/item/O)
if(istype(O, /obj/item/device/pda))
var/obj/item/device/pda/P = O
/obj/effect/nanomob/hitby(atom/movable/AM)
if(istype(AM, /obj/item/device/pda))
var/obj/item/device/pda/P = AM
attempt_capture(P) //attempting a ranged capture does not affect the mob's effective run_chance but does prevent you from being shocked by a trap mob
return 1
+2 -2
View File
@@ -7,7 +7,7 @@
icon_state = "trade_card"
force = 0
throwforce = 1
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/datum/mob_hunt/mob_data
/obj/item/weapon/nanomob_card/proc/update_info()
@@ -40,4 +40,4 @@
/obj/item/weapon/storage/box/nanomob_booster_pack/New()
..()
for(var/i in 1 to 6)
new /obj/item/weapon/nanomob_card/booster(src)
new /obj/item/weapon/nanomob_card/booster(src)
+1 -1
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/assemblies/new_assemblies.dmi'
icon_state = ""
flags = CONDUCT
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=100)
throwforce = 2
throw_speed = 3
+2 -2
View File
@@ -3,7 +3,7 @@
icon = 'icons/obj/tank.dmi'
item_state = "assembly"
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 2
throw_range = 4
flags = CONDUCT //Copied this from old code, so this may or may not be necessary
@@ -171,4 +171,4 @@
if(!T)
return
T.assume_air(removed)
air_update_turf()
air_update_turf()
+2 -7
View File
@@ -5,7 +5,7 @@
item_state = "assembly"
flags = CONDUCT
throwforce = 5
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 10
@@ -100,7 +100,7 @@
a_left.hear_talk(M, msg)
if(a_right)
a_right.hear_talk(M, msg)
hear_message(mob/living/M as mob, msg)
if(a_left)
a_left.hear_message(M, msg)
@@ -210,8 +210,3 @@
qdel(src)
return
return
+1 -1
View File
@@ -6,7 +6,7 @@
var/obj/item/clothing/head/helmet/part1 = null
var/obj/item/device/radio/electropack/part2 = null
var/status = 0
w_class = 5
w_class = WEIGHT_CLASS_HUGE
flags = CONDUCT
/obj/item/assembly/shock_kit/Destroy()
+5 -5
View File
@@ -85,7 +85,7 @@
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
name = "ears"
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 2
slot_flags = SLOT_EARS
burn_state = FIRE_PROOF
@@ -128,7 +128,7 @@
/obj/item/clothing/ears/offear
name = "Other ear"
w_class = 5
w_class = WEIGHT_CLASS_HUGE
icon = 'icons/mob/screen_gen.dmi'
icon_state = "block"
slot_flags = SLOT_EARS | SLOT_TWOEARS
@@ -145,7 +145,7 @@
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags_cover = GLASSESCOVERSEYES
slot_flags = SLOT_EYES
materials = list(MAT_GLASS = 250)
@@ -177,7 +177,7 @@ BLIND // can't see anything
/obj/item/clothing/gloves
name = "gloves"
gender = PLURAL //Carn: for grammarically correct text-parsing
w_class = 2
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/clothing/gloves.dmi'
siemens_coefficient = 0.50
body_parts_covered = HANDS
@@ -543,7 +543,7 @@ BLIND // can't see anything
desc = "A suit that protects against low pressure environments. Has a big 13 on the back."
icon_state = "space"
item_state = "s_suit"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
+1 -1
View File
@@ -380,7 +380,7 @@
throwforce = 3.0
throw_speed = 2
throw_range = 5
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("warned", "cautioned", "smashed")
burn_state = FIRE_PROOF
+3 -3
View File
@@ -5,7 +5,7 @@
item_state = "balaclava"
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/adjust)
adjusted_flags = SLOT_HEAD
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
@@ -27,7 +27,7 @@
item_state = "luchag"
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
w_class = WEIGHT_CLASS_SMALL
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
@@ -47,4 +47,4 @@
name = "Rudos Mask"
desc = "Worn by robust fighters who are willing to do anything to win."
icon_state = "luchar"
item_state = "luchar"
item_state = "luchar"
+1 -1
View File
@@ -5,7 +5,7 @@
item_state = "breath"
flags = AIRTIGHT
flags_cover = MASKCOVERSMOUTH
w_class = 2
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.10
permeability_coefficient = 0.50
actions_types = list(/datum/action/item_action/adjust)
+2 -3
View File
@@ -5,7 +5,7 @@
flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -70,7 +70,7 @@
flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
item_state = "bane_mask"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -494,4 +494,3 @@
// ********************************************************************
+12 -12
View File
@@ -4,7 +4,7 @@
icon_state = "muzzle"
item_state = "muzzle"
flags_cover = MASKCOVERSMOUTH
w_class = 2
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
put_on_delay = 20
var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove
@@ -24,14 +24,14 @@
name = "gag"
desc = "Stick this in their mouth to stop the noise."
icon_state = "gag"
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/clothing/mask/muzzle/tapegag
name = "tape gag"
desc = "MHPMHHH!"
icon_state = "tapegag"
item_state = null
w_class = 1
w_class = WEIGHT_CLASS_TINY
resist_time = 150
mute = 0
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
@@ -59,7 +59,7 @@
desc = "A sterile mask designed to help prevent the spread of diseases."
icon_state = "sterile"
item_state = "sterile"
w_class = 1
w_class = WEIGHT_CLASS_TINY
flags_cover = MASKCOVERSMOUTH
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
@@ -109,7 +109,7 @@
icon_state = "blueneckscarf"
item_state = "blueneckscarf"
flags_cover = MASKCOVERSMOUTH
w_class = 2
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
/obj/item/clothing/mask/redscarf
@@ -118,7 +118,7 @@
icon_state = "redwhite_scarf"
item_state = "redwhite_scarf"
flags_cover = MASKCOVERSMOUTH
w_class = 2
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
/obj/item/clothing/mask/greenscarf
@@ -127,7 +127,7 @@
icon_state = "green_scarf"
item_state = "green_scarf"
flags_cover = MASKCOVERSMOUTH
w_class = 2
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
/obj/item/clothing/mask/ninjascarf
@@ -136,7 +136,7 @@
icon_state = "ninja_scarf"
item_state = "ninja_scarf"
flags_cover = MASKCOVERSMOUTH
w_class = 2
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
@@ -147,7 +147,7 @@
item_state = "pig"
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
w_class = WEIGHT_CLASS_SMALL
/obj/item/clothing/mask/horsehead
@@ -157,7 +157,7 @@
item_state = "horsehead"
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/voicechange = 0
var/temporaryname = " the Horse"
var/originalname = ""
@@ -247,7 +247,7 @@
icon_state = "fawkes"
item_state = "fawkes"
flags_inv = HIDEFACE
w_class = 2
w_class = WEIGHT_CLASS_SMALL
/obj/item/clothing/mask/gas/clown_hat/pennywise
name = "Pennywise Mask"
@@ -263,7 +263,7 @@
desc = "A colorful bandana."
flags_inv = HIDEFACE
flags_cover = MASKCOVERSMOUTH
w_class = 1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_MASK
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
+1 -1
View File
@@ -74,7 +74,7 @@
// Vox space gear (vaccuum suit, low pressure armour)
// Can't be equipped by any other species due to bone structure and vox cybernetics.
/obj/item/clothing/suit/space/vox
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+1 -1
View File
@@ -29,7 +29,7 @@
desc = "A suit worn by members of the Nanotrasen Emergency Response Team. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
item_state = "suit-command"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
+2 -2
View File
@@ -352,7 +352,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/on = 1
actions_types = list(/datum/action/item_action/toggle_hardsuit_mode)
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
@@ -447,7 +447,7 @@
name = "gem-encrusted hardsuit"
desc = "A bizarre gem-encrusted suit that radiates magical energies."
item_state = "wiz_hardsuit"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
unacidable = 1
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank)
@@ -27,7 +27,7 @@
desc = "A bulky, heavy-duty piece of exclusive Nanotrasen armor. YOU are in charge!"
icon_state = "caparmor"
item_state = "capspacesuit"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
allowed = list(/obj/item/weapon/tank, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
@@ -86,7 +86,7 @@
blood_overlay_type = "coat"
flags_inv = 0
slowdown = 0
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
//Space santa outfit suit
/obj/item/clothing/head/helmet/space/santahat
@@ -123,7 +123,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -62,7 +62,7 @@
flags = null //non-conductive
force = 0
throwforce = 0
w_class = 2 //Fits in boxes.
w_class = WEIGHT_CLASS_SMALL //Fits in boxes.
materials = list()
attack_verb = list("tapped")
+1 -6
View File
@@ -14,7 +14,7 @@
slot_flags = SLOT_BACK
req_one_access = list()
req_access = list()
w_class = 4
w_class = WEIGHT_CLASS_BULKY
// These values are passed on to all component pieces.
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
@@ -985,11 +985,6 @@
// AIs are a bit slower than regular and ignore move intent.
wearer_move_delay = world.time + ai_controlled_move_delay
var/tickcomp = 0
if(config.Tickcomp)
tickcomp = ((1/(world.tick_lag))*1.3) - 1.3
wearer_move_delay += tickcomp
if(wearer.buckled) //if we're buckled to something, tell it we moved.
return wearer.buckled.relaymove(wearer, direction)
+2 -2
View File
@@ -12,7 +12,7 @@
icon_state = "syndicate"
item_state = "space_suit_syndicate"
desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -173,4 +173,4 @@ obj/item/clothing/suit/space/syndicate/black/red/strike
/obj/item/clothing/suit/space/syndicate/black/engie
name = "Black Engineering Space Suit"
icon_state = "syndicate-black-engie"
item_state = "syndicate-black"
item_state = "syndicate-black"
+2 -2
View File
@@ -376,7 +376,7 @@
desc = "A suit that protects against some damage."
icon_state = "centcom"
item_state = "centcom"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
flags = THICKMATERIAL
@@ -393,7 +393,7 @@
icon_state = "heavy"
item_state = "swat_suit"
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.90
flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+2 -2
View File
@@ -15,7 +15,7 @@
desc = "A suit that protects against biological contamination."
icon_state = "bio"
item_state = "bio_suit"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags = THICKMATERIAL
@@ -93,4 +93,4 @@
strip_delay = 40
put_on_delay = 20
species_fit = null
sprite_sheets = null
sprite_sheets = null
+2 -2
View File
@@ -135,7 +135,7 @@
icon_state = "syndicate-black-red"
item_state = "syndicate-black-red"
desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
burn_state = FIRE_PROOF
@@ -714,7 +714,7 @@
desc = "A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician."
icon_state = "mercy_hoodie"
item_state = "mercy_hoodie"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_size = ONESIZEFITSALL
+1 -1
View File
@@ -5,7 +5,7 @@
..()
pockets = new/obj/item/weapon/storage/internal(src)
pockets.storage_slots = 2 //two slots
pockets.max_w_class = 2 //fit only pocket sized items
pockets.max_w_class = WEIGHT_CLASS_SMALL //fit only pocket sized items
pockets.max_combined_w_class = 4
/obj/item/clothing/suit/storage/Destroy()
+5 -5
View File
@@ -14,7 +14,7 @@
desc = "A suit that protects against fire and heat."
icon_state = "fire"
item_state = "fire_suit"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
@@ -43,7 +43,7 @@
desc = "A suit that protects against extreme fire and heat."
//icon_state = "thermal"
item_state = "ro_suit"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
slowdown = 1.5
/obj/item/clothing/suit/fire/atmos
@@ -85,7 +85,7 @@
desc = "A suit designed for safety when handling explosives."
icon_state = "bombsuit"
item_state = "bombsuit"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags = THICKMATERIAL
@@ -142,7 +142,7 @@
desc = "A suit that protects against radiation. Label: Made with lead, do not eat insulation."
icon_state = "rad"
item_state = "rad_suit"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
flags = THICKMATERIAL
@@ -157,4 +157,4 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
)
@@ -6,7 +6,7 @@
item_state = "" //no inhands
item_color = "bluetie"
slot_flags = SLOT_TIE
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/slot = "decor"
var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
@@ -7,7 +7,7 @@
var/holster_allow = /obj/item/weapon/gun
var/obj/item/weapon/gun/holstered = null
actions_types = list(/datum/action/item_action/accessory/holster)
w_class = 3 // so it doesn't fit in pockets
w_class = WEIGHT_CLASS_NORMAL // so it doesn't fit in pockets
/obj/item/clothing/accessory/holster/Destroy()
QDEL_NULL(holstered)
@@ -140,4 +140,4 @@
name = "shoulder holster"
desc = "A handgun holster. Made of expensive leather."
icon_state = "holster"
item_color = "holster_low"
item_color = "holster_low"
@@ -7,7 +7,7 @@
var/slots = 3
var/obj/item/weapon/storage/internal/hold
actions_types = list(/datum/action/item_action/accessory/storage)
w_class = 3 // so it doesn't fit in pockets
w_class = WEIGHT_CLASS_NORMAL // so it doesn't fit in pockets
/obj/item/clothing/accessory/storage/New()
..()
@@ -110,4 +110,4 @@
hold.can_hold = list(/obj/item/weapon/hatchet/unathiknife, /obj/item/weapon/kitchen/knife)
new /obj/item/weapon/hatchet/unathiknife(hold)
new /obj/item/weapon/hatchet/unathiknife(hold)
new /obj/item/weapon/hatchet/unathiknife(hold)
+1 -1
View File
@@ -167,7 +167,7 @@
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
w_class = 4//bulky item
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+62 -7
View File
@@ -20,7 +20,7 @@
icon_state = "tatgun"
force = 0
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages
var/tattoo_icon = "Tiger-stripe Tattoo" // body_accessory.dmi, new icons defined in sprite_accessories.dm
var/tattoo_r = 1 // RGB values for the body markings
@@ -221,7 +221,7 @@
item_state = "lunch_box"
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 9
storage_slots = 3
@@ -248,7 +248,7 @@
hitsound = 'sound/weapons/tap.ogg'
force = 0
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/used = 0
/obj/item/fluff/wingler_comb/attack_self(mob/user)
@@ -268,7 +268,7 @@
desc = "Some sci-fi looking parts for a stun baton."
icon = 'icons/obj/custom_items.dmi'
icon_state = "scifikit"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
/obj/item/device/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
@@ -293,7 +293,7 @@
name = "welding helmet modkit"
desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!"
icon_state = "modkit"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 0
throwforce = 0
@@ -318,7 +318,7 @@
name = "plasmaman suit modkit"
desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
icon_state = "modkit"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 0
throwforce = 0
@@ -429,7 +429,7 @@
name = "sallet modkit"
desc = "A modkit that can make most helmets look like a steel sallet."
icon_state = "modkit"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 0
throwforce = 0
@@ -468,6 +468,30 @@
else
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/k3_webbing_modkit //IK3I: Yakikatachi
name = "webbing modkit"
desc = "A modkit that can be used to turn certain vests and labcoats into lightweight webbing"
icon_state = "modkit"
w_class = 2
force = 0
throwforce = 0
/obj/item/device/fluff/k3_webbing_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
if(istype(target, /obj/item/clothing/suit/storage/labcoat) || istype(target, /obj/item/clothing/suit/storage/hazardvest))
var/mob/living/carbon/human/H = user
var/obj/item/clothing/suit/storage/S = target
var/obj/item/clothing/suit/storage/fluff/k3_webbing/webbing = new(get_turf(target))
webbing.allowed = S.allowed
to_chat(user, "<span class='notice'>You modify the [S] with [src].</span>")
H.update_inv_wear_suit()
qdel(S)
qdel(src)
else
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
//////////////////////////////////
//////////// Clothing ////////////
//////////////////////////////////
@@ -704,6 +728,37 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "shodancoat"
/obj/item/clothing/suit/storage/fluff/k3_webbing
name = "vox tactical webbing"
desc = "A somewhat worn but well kept set of vox tactical webbing. It has a couple of pouches attached."
icon = 'icons/obj/custom_items.dmi'
icon_state = "k3_webbing"
species_fit = list("Vox")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
ignore_suitadjust = 0
actions_types = list(/datum/action/item_action/toggle)
suit_adjusted = 0
/obj/item/clothing/suit/storage/fluff/k3_webbing/adjustsuit(var/mob/user)
if(!user.incapacitated())
var/flavour
if(suit_adjusted)
flavour = "off"
icon_state = copytext(icon_state, 1, findtext(icon_state, "_on"))
item_state = copytext(item_state, 1, findtext(item_state, "_on"))
suit_adjusted = 0 //Lights Off
else
flavour = "on"
icon_state += "_on"
item_state += "_on"
suit_adjusted = 1 //Lights On
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
to_chat(user, "You turn the [src]'s lighting system [flavour].")
user.update_inv_wear_suit()
//////////// Uniforms ////////////
/obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile
name = "Castile formal outfit"
+5 -5
View File
@@ -6,7 +6,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "evidenceobj"
item_state = ""
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user,proximity)
if(!proximity || loc == I)
@@ -29,7 +29,7 @@
to_chat(user, "<span class='notice'>You find putting an evidence bag in another evidence bag to be slightly absurd.</span>")
return 1 //now this is podracing
if(I.w_class > 3)
if(I.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user, "<span class='notice'>[I] won't fit in [src].</span>")
return
@@ -76,7 +76,7 @@
"<span class='notice'>You hear someone rustle around in a plastic bag, and remove something.</span>")
overlays.Cut() //remove the overlays
user.put_in_hands(I)
w_class = 1
w_class = WEIGHT_CLASS_TINY
icon_state = "evidenceobj"
desc = "An empty evidence bag."
@@ -87,7 +87,7 @@
/obj/item/weapon/storage/box/evidence
name = "evidence bag box"
desc = "A box claiming to contain evidence bags."
/obj/item/weapon/storage/box/evidence/New()
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
@@ -95,4 +95,4 @@
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
..()
..()
@@ -17,7 +17,7 @@
/obj/item/weapon/reagent_containers/glass/rag
name = "damp rag"
desc = "For cleaning up messes, you suppose."
w_class = 1
w_class = WEIGHT_CLASS_TINY
icon = 'icons/obj/toy.dmi'
icon_state = "rag"
amount_per_transfer_from_this = 5
+1 -1
View File
@@ -7,7 +7,7 @@
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
icon = 'icons/goonstation/objects/objects.dmi'
icon_state = "detscanner"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
item_state = "electronic"
flags = CONDUCT | NOBLUDGEON
slot_flags = SLOT_BELT
+1 -2
View File
@@ -4,7 +4,7 @@
desc = "Eggs laid by a fish. This cluster seems... empty?"
icon = 'icons/obj/fish_items.dmi'
icon_state = "eggs"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/datum/fish/fish_type = null //Holds the datum of the fish that the egg is for, null means dud eggs
/obj/item/fish_eggs/goldfish
@@ -66,4 +66,3 @@
desc = "A cluster of bright neon eggs belonging to a bio-luminescent species of fish."
icon_state = "glofish_eggs"
fish_type = /datum/fish/glofish
+5 -5
View File
@@ -10,7 +10,7 @@
icon_state = "egg_scoop"
slot_flags = SLOT_BELT
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
@@ -21,7 +21,7 @@
icon_state = "net"
slot_flags = SLOT_BELT
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
@@ -35,7 +35,7 @@
icon = 'icons/obj/fish_items.dmi'
icon_state = "fish_food"
throwforce = 1
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
@@ -46,7 +46,7 @@
icon_state = "brush"
slot_flags = SLOT_BELT
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
attack_verb = list("scrubbed", "brushed", "scraped")
@@ -90,7 +90,7 @@
icon = 'icons/obj/fish_items.dmi'
icon_state = "fish"
throwforce = 1
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
force = 1
+4 -5
View File
@@ -11,7 +11,7 @@
icon_state = "tank1"
density = 0
anchored = 0
throwpass = 0
pass_flags = 0
var/tank_type = "" // Type of aquarium, used for icon updating
var/water_capacity = 0 // Number of units the tank holds (varies with tank type)
@@ -38,8 +38,7 @@
icon_state = "bowl1"
density = 0 // Small enough to not block stuff
anchored = 0 // Small enough to move even when filled
throwpass = 1 // Just like at the county fair, you can't seem to throw the ball in to win the goldfish
pass_flags = PASSTABLE // Small enough to pull onto a table
pass_flags = PASSTABLE | LETPASSTHROW // Just like at the county fair, you can't seem to throw the ball in to win the goldfish, and it's small enough to pull onto a table
tank_type = "bowl"
water_capacity = 50 // Not very big, therefore it can't hold much
@@ -57,7 +56,7 @@
icon_state = "tank1"
density = 1
anchored = 1
throwpass = 1 // You can throw objects over this, despite it's density, because it's short enough.
pass_flags = LETPASSTHROW
tank_type = "tank"
water_capacity = 200 // Decent sized, holds almost 2 full buckets
@@ -75,7 +74,7 @@
icon_state = "wall1"
density = 1
anchored = 1
throwpass = 0 // This thing is the size of a wall, you can't throw past it.
pass_flags = 0 // This thing is the size of a wall, you can't throw past it.
tank_type = "wall"
water_capacity = 500 // This thing fills an entire tile, it holds a lot.
+2 -45
View File
@@ -180,49 +180,6 @@ Gunshots/explosions/opening doors/less rare audio (done)
..()
name = "alien hunter ([rand(1, 1000)])"
/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property
if(!target || !src || (flags & NODROP))
return 0
throwing = 1
var/dist_x = abs(target.x - x)
var/dist_y = abs(target.y - y)
var/dist_travelled = 0
var/dist_since_sleep = 0
var/tdist_x = dist_x;
var/tdist_y = dist_y;
if(dist_x <= dist_y)
tdist_x = dist_y;
tdist_y = dist_x;
var/error = tdist_x/2 - tdist_y
while(target && (((((dist_x > dist_y) && ((x < target.x) || (x > target.x))) || ((dist_x <= dist_y) && ((y < target.y) || (y > target.y))) || (x > target.x)) && dist_travelled < range) || !has_gravity(src)))
if(!throwing)
break
if(!istype(loc, /turf))
break
var/atom/step = get_step(src, get_dir(src, target))
if(!step)
break
Move(step, get_dir(src, step))
hit_check()
error += (error < 0) ? tdist_x : -tdist_y;
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
throwing = 0
throw_impact(get_turf(src))
return 1
/obj/effect/hallucination/simple/xeno/throw_impact(A)
update_icon("alienh_pounce")
if(A == target)
@@ -247,12 +204,12 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(!xeno)
return
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(target,7,1)
xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
sleep(10)
if(!xeno)
return
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(pump,7,1)
xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
sleep(10)
if(!xeno)
return
@@ -141,7 +141,7 @@
name = "pewter cup"
desc = "Everyone gets a trophy."
icon_state = "pewter_cup"
w_class = 1
w_class = WEIGHT_CLASS_TINY
force = 1
throwforce = 1
amount_per_transfer_from_this = 5
@@ -154,7 +154,7 @@
name = "gold cup"
desc = "You're winner!"
icon_state = "golden_cup"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
force = 14
throwforce = 10
amount_per_transfer_from_this = 20
@@ -165,7 +165,7 @@
name = "silver cup"
desc = "Best loser!"
icon_state = "silver_cup"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 10
throwforce = 8
amount_per_transfer_from_this = 15
@@ -176,7 +176,7 @@
name = "bronze cup"
desc = "At least you ranked!"
icon_state = "bronze_cup"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 5
throwforce = 4
amount_per_transfer_from_this = 10
@@ -349,4 +349,4 @@
desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point."
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_bowl"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
@@ -130,7 +130,7 @@
throwforce = 5
throw_speed = 3
throw_range = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
item_state = "beer"
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("stabbed", "slashed", "attacked")
+2 -2
View File
@@ -130,7 +130,7 @@
istype(W, /obj/item/weapon/hatchet) \
)
inaccurate = 1
else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable))
else if(W.w_class <= WEIGHT_CLASS_SMALL && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable))
if(!iscarbon(user))
return 1
to_chat(user, "<span class='warning'>You slip [W] inside [src].</span>")
@@ -2477,4 +2477,4 @@
desc = "A large fried potato nugget that may or may not try to valid you."
icon_state = "tatortot"
list_reagents = list("nutriment" = 4)
filling_color = "FFD700"
filling_color = "FFD700"
+1 -1
View File
@@ -43,7 +43,7 @@
desc = "A peel from a banana."
icon_state = "banana_peel"
item_state = "banana_peel"
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 3
throw_range = 7
+3 -3
View File
@@ -30,7 +30,7 @@
desc = "A reminder of meals gone by."
icon_state = "corncob"
item_state = "corncob"
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 3
throw_range = 7
@@ -62,7 +62,7 @@
desc = "A cob with snap pops"
icon_state = "snapcorn"
item_state = "corncob"
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 3
throw_range = 7
@@ -81,4 +81,4 @@
snap_pops -= 1
if(!snap_pops)
new /obj/item/weapon/grown/corncob(user.loc)
qdel(src)
qdel(src)
+2 -2
View File
@@ -117,7 +117,7 @@
force = 0
slot_flags = SLOT_HEAD
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 3
@@ -167,7 +167,7 @@
force = 0
slot_flags = SLOT_HEAD
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 3
attack_verb = list("roasted", "scorched", "burned")
+1 -1
View File
@@ -22,7 +22,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/watermelonslice
slices_num = 5
dried_type = null
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
filling_color = "#008000"
bitesize_mod = 3
+1 -1
View File
@@ -37,7 +37,7 @@
force = 15
hitsound = 'sound/weapons/bladeslice.ogg'
throwforce = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 3
origin_tech = "combat=3"
+2 -2
View File
@@ -37,7 +37,7 @@
icon_state = "logs"
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 2
throw_range = 3
origin_tech = "materials=1"
@@ -191,4 +191,4 @@
/obj/structure/bonfire/unbuckle_mob(force=0)
if(buckled_mob)
buckled_mob.pixel_y -= 13
. = ..()
. = ..()
+11 -11
View File
@@ -5,7 +5,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "hydro"
item_state = "analyzer"
w_class = 1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
origin_tech = "magnets=2;biotech=2"
materials = list(MAT_METAL=30, MAT_GLASS=20)
@@ -24,7 +24,7 @@
flags = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 10
@@ -46,7 +46,7 @@
flags = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 10
@@ -68,7 +68,7 @@
flags = CONDUCT
force = 5
throwforce = 7
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50)
attack_verb = list("slashed", "sliced", "cut", "clawed")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -80,7 +80,7 @@
icon_state = "hatchet"
flags = CONDUCT
force = 12
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 15
throw_speed = 3
throw_range = 4
@@ -111,7 +111,7 @@
throwforce = 5
throw_speed = 2
throw_range = 3
w_class = 4
w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
armour_penetration = 20
slot_flags = SLOT_BACK
@@ -140,7 +140,7 @@
force = 3
sharp = 0
edge = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
extend = 0
slot_flags = SLOT_BELT
origin_tech = "materials=3;combat=3"
@@ -154,7 +154,7 @@
icon_state = "tscythe1"
item_state = "scythe0" //use the normal scythe in-hands
slot_flags = SLOT_BACK //won't fit on belt, but can be worn on belt when extended
w_class = 4 //won't fit in backpacks while extended
w_class = WEIGHT_CLASS_BULKY //won't fit in backpacks while extended
force = 15 //slightly better than normal scythe damage
attack_verb = list("chopped", "sliced", "cut", "reaped")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -165,7 +165,7 @@
icon_state = "tscythe0"
item_state = null //no sprite for folded version, like a tele-baton
slot_flags = SLOT_BELT //can be worn on belt again, but no longer makes sense to wear on the back
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 3
attack_verb = list("hit", "poked")
hitsound = "swing_hit"
@@ -200,7 +200,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
volume = 50
w_class = 1
w_class = WEIGHT_CLASS_TINY
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(1,2,5,10,15,25,50)
@@ -249,7 +249,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
volume = 50
w_class = 1
w_class = WEIGHT_CLASS_TINY
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(1,2,5,10,15,25,50)
+1 -1
View File
@@ -5,7 +5,7 @@
/obj/item/seeds
icon = 'icons/obj/hydroponics/seeds.dmi'
icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game.
w_class = 1
w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
var/plantname = "Plants" // Name of plant when planted.
var/product // A type path. The thing that is created when the plant is harvested.
+3 -3
View File
@@ -167,7 +167,7 @@
icon_state ="book"
throw_speed = 1
throw_range = 5
w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
attack_verb = list("bashed", "whacked", "educated")
burn_state = FLAMMABLE
@@ -201,7 +201,7 @@
/obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(carved)
if(!store)
if(W.w_class < 3)
if(W.w_class < WEIGHT_CLASS_NORMAL)
user.drop_item()
W.forceMove(src)
store = W
@@ -293,7 +293,7 @@
icon_state ="scanner"
throw_speed = 1
throw_range = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/obj/machinery/computer/library/checkout/computer // Associated computer - Modes 1 to 3 use this
var/obj/item/weapon/book/book // Currently scanned book
var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
+1 -1
View File
@@ -172,7 +172,7 @@
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 10
w_class = 4
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
force_unwielded = 10
force_wielded = 24
+2 -2
View File
@@ -7,7 +7,7 @@
flags = CONDUCT
force = 1
throwforce = 2
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/string_attached
var/list/sideslist = list("heads","tails")
var/cmineral = null
@@ -149,4 +149,4 @@
if(do_after(user, 15, target = src))
user.visible_message("<span class='notice'>[user] has flipped [src]. It lands on [coinflip].</span>", \
"<span class='notice'>You flip [src]. It lands on [coinflip].</span>", \
"<span class='notice'>You hear the clattering of loose change.</span>")
"<span class='notice'>You hear the clattering of loose change.</span>")
+11 -11
View File
@@ -521,7 +521,7 @@
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
icon = 'icons/obj/items.dmi'
icon_state = "mining_voucher"
w_class = 1
w_class = WEIGHT_CLASS_TINY
/**********************Mining Point Card**********************/
@@ -555,7 +555,7 @@
icon_state = "Jaunter"
item_state = "electronic"
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
origin_tech = "bluespace=2"
@@ -615,7 +615,7 @@
icon_state = "resonator"
item_state = "resonator"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum."
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 8
throwforce = 10
var/cooldown = 0
@@ -711,7 +711,7 @@
/obj/item/weapon/mining_drone_cube
name = "mining drone cube"
desc = "Compressed mining drone, ready for deployment. Just press the button to activate!"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/aibots.dmi'
icon_state = "minedronecube"
item_state = "electronic"
@@ -728,7 +728,7 @@
name = "Drone Kit"
desc = "A boxed kit that includes one mining drone cube and a welding tool with an increased capacity."
icon_state = "implant"
max_w_class = 3
max_w_class = WEIGHT_CLASS_NORMAL
storage_slots = 2
can_hold = list(/obj/item/weapon/mining_drone_cube, /obj/item/weapon/weldingtool/hugetank)
@@ -746,7 +746,7 @@
icon_state = "lazarus_hypo"
item_state = "hypo"
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
var/loaded = 1
@@ -806,7 +806,7 @@
name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
@@ -838,7 +838,7 @@
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 35
@@ -931,7 +931,7 @@
desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity."
volume = 40
throw_range = 7
w_class = 3 //same as syndie harness
w_class = WEIGHT_CLASS_NORMAL //same as syndie harness
/*********************Hivelord stabilizer****************/
@@ -940,7 +940,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely."
w_class = 1
w_class = WEIGHT_CLASS_TINY
origin_tech = "biotech=1"
/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user)
@@ -963,7 +963,7 @@
\n<span class='info'>Mark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \
This weapon is only particularly effective against large creatures.</span>"
force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
w_class = 4
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
force_unwielded = 20 //It's never not wielded so these are the same
force_wielded = 20
+2 -2
View File
@@ -155,7 +155,7 @@
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_shavings"
list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2)
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/reagent_containers/food/snacks/ash_flora/New()
..()
@@ -194,7 +194,7 @@
desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point."
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_bowl"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
//what you can craft with these things
/datum/crafting_recipe/mushroom_bowl
@@ -15,8 +15,8 @@
if(4)
new /obj/item/weapon/dragons_blood(src)
// Spectral Blade
// Spectral Blade
/obj/item/weapon/melee/ghost_sword
name = "spectral blade"
desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
@@ -25,7 +25,7 @@
flags = CONDUCT
sharp = 1
edge = 1
w_class = 4
w_class = WEIGHT_CLASS_BULKY
force = 1
throwforce = 1
hitsound = 'sound/effects/ghost2.ogg'
@@ -71,7 +71,7 @@
var/turf/T = get_turf(src)
var/list/contents = T.GetAllContents()
var/mob/dead/observer/current_spirits = list()
for(var/mob/dead/observer/O in player_list)
if(is_type_in_list(O.following, contents))
ghost_counter++
@@ -145,7 +145,7 @@
stage4 = list("<span class='danger'>Your blood burns.</span>")
stage5 = list("<span class='danger'>You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason.</span>")
new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
//Lava Staff
/obj/item/weapon/lava_staff
@@ -156,7 +156,7 @@
icon = 'icons/obj/guns/magic.dmi'
slot_flags = SLOT_BACK
item_state = "staffofstorms"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
force = 25
damtype = BURN
hitsound = 'sound/weapons/sear.ogg'
@@ -214,4 +214,4 @@
/obj/effect/overlay/temp/lavastaff
icon_state = "lavastaff_warn"
duration = 50
duration = 50
@@ -5,7 +5,7 @@
item_state = "hierophant_staff"
icon = 'icons/obj/guns/magic.dmi'
slot_flags = SLOT_BACK
w_class = 4
w_class = WEIGHT_CLASS_BULKY
force = 20
hitsound = "swing_hit"
//hitsound = 'sound/weapons/sonic_jackhammer.ogg'
@@ -185,4 +185,4 @@
//playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check)
new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check)
@@ -6,7 +6,7 @@
icon = 'icons/obj/guns/magic.dmi'
slot_flags = SLOT_BACK
item_state = "staffofstorms"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
force = 25
damtype = BURN
hitsound = 'sound/weapons/sear.ogg'
@@ -49,4 +49,4 @@
"<span class='notice'>You hold [src] skyward, calling down a terrible storm!</span>")
playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0)
A.telegraph()
storm_cooldown = world.time + 200
storm_cooldown = world.time + 200
@@ -5,7 +5,7 @@
name = "paradox bag"
desc = "Somehow, it's in two places at once."
max_combined_w_class = 60
max_w_class = 3
max_w_class = WEIGHT_CLASS_NORMAL
//External
/obj/item/device/shared_storage
@@ -144,7 +144,7 @@
item_state = "rods"
desc = "Not to be confused with the kind Research hassles you for."
force = 12
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
burn_state = LAVA_PROOF | FIRE_PROOF
/datum/crafting_recipe/oar
@@ -391,4 +391,4 @@
if(!can_destroy && !force)
return QDEL_HINT_LETMELIVE
else
. = ..()
. = ..()
+6 -6
View File
@@ -79,7 +79,7 @@
force = 15.0
throwforce = 10.0
item_state = "pickaxe"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
origin_tech = "materials=1;engineering=1"
@@ -152,7 +152,7 @@
icon_state = "smdrill"
origin_tech = "materials=6;powerstorage=4;engineering=5;syndicate=3"
desc = "Microscopic supermatter crystals cover the head of this tiny drill."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/drill/cyborg/diamond //This is the BORG version!
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
@@ -184,7 +184,7 @@
force = 8.0
throwforce = 4.0
item_state = "shovel"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=50)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
@@ -198,7 +198,7 @@
item_state = "spade"
force = 5.0
throwforce = 7.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
toolspeed = 2
@@ -219,7 +219,7 @@
desc = "It allows you to store and deploy lazarus-injected creatures easier."
icon = 'icons/obj/mobcap.dmi'
icon_state = "mobcap0"
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_range = 20
var/mob/living/simple_animal/captured = null
var/colorindex = 0
@@ -282,7 +282,7 @@
desc = "An emergency shelter stored within a pocket of bluespace."
icon_state = "capsule"
icon = 'icons/obj/mining.dmi'
w_class = 1
w_class = WEIGHT_CLASS_TINY
origin_tech = "engineering=3;bluespace=3"
var/template_id = "shelter_alpha"
var/datum/map_template/shelter/template
+2 -2
View File
@@ -9,7 +9,7 @@
throwforce = 0
burn_state = FLAMMABLE
burntime = 20
w_class = 4
w_class = WEIGHT_CLASS_BULKY
/obj/item/weapon/moneybag/attack_hand(user as mob)
var/amt_gold = 0
@@ -119,4 +119,4 @@
new /obj/item/weapon/coin/silver(src)
new /obj/item/weapon/coin/gold(src)
new /obj/item/weapon/coin/gold(src)
new /obj/item/weapon/coin/adamantine(src)
new /obj/item/weapon/coin/adamantine(src)
+1 -1
View File
@@ -153,7 +153,7 @@
icon = 'icons/obj/mining.dmi'
icon_state = "Gibtonite ore"
item_state = "Gibtonite ore"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
throw_range = 0
anchored = 1 //Forces people to carry it by hand, no pulling!
var/primed = 0
@@ -1,5 +1,5 @@
/mob/living/carbon/alien/hitby(atom/movable/AM)
..(AM, 1)
/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush)
..(AM, hitpush = 0)
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
@@ -13,6 +13,10 @@
alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter
..()
/mob/living/carbon/alien/humanoid/hunter/movement_delay()
. = -1 //hunters are sanic
. += ..() //but they still need to slow down on stun
/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates()
..() //-Yvarov
@@ -79,17 +83,18 @@
else //Maybe uses plasma in the future, although that wouldn't make any sense...
leaping = 1
update_icons()
throw_at(A,MAX_ALIEN_LEAP_DIST,1)
leaping = 0
update_icons()
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, .leap_end))
/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
leaping = 0
update_icons()
/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A)
if(!leaping)
return ..()
if(A)
if(istype(A, /mob/living))
if(isliving(A))
var/mob/living/L = A
var/blocked = 0
if(ishuman(A))
@@ -126,46 +131,3 @@
if(leaping)
return
..()
//Modified throw_at() that will use diagonal dirs where appropriate
//instead of locking it to cardinal dirs
/mob/living/carbon/alien/humanoid/throw_at(atom/target, range, speed)
if(!target || !src) return 0
src.throwing = 1
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
var/dist_travelled = 0
var/dist_since_sleep = 0
var/tdist_x = dist_x;
var/tdist_y = dist_y;
if(dist_x <= dist_y)
tdist_x = dist_y;
tdist_y = dist_x;
var/error = tdist_x/2 - tdist_y
while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
if(!src.throwing) break
if(!istype(src.loc, /turf)) break
var/atom/step = get_step(src, get_dir(src,target))
if(!step)
break
src.Move(step, get_dir(src, step))
hit_check()
error += (error < 0) ? tdist_x : -tdist_y;
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
src.throwing = 0
return 1
@@ -12,14 +12,12 @@
pixel_x = -16
maxHealth = 200
health = 200
move_delay_add = 1
large = 1
/mob/living/carbon/alien/humanoid/sentinel/praetorian
name = "alien praetorian"
maxHealth = 200
health = 200
move_delay_add = 1
large = 1
/mob/living/carbon/alien/humanoid/sentinel/large/update_icons()
@@ -6,7 +6,6 @@
icon_state = "alienq_s"
status_flags = CANPARALYSE
mob_size = MOB_SIZE_LARGE
move_delay_add = 3
large = 1
ventcrawler = 0
@@ -24,44 +24,10 @@
add_language("Hivemind")
..()
//This is fine, works the same as a human
/mob/living/carbon/alien/humanoid/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
if((!( yes ) || now_pushing))
return
now_pushing = 0
..()
if(!istype(AM, /atom/movable))
return
if(ismob(AM))
var/mob/tmob = AM
tmob.LAssailant = src
if(!now_pushing)
now_pushing = 1
if(!AM.anchored)
var/t = get_dir(src, AM)
if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
now_pushing = null
return
return
/mob/living/carbon/alien/humanoid/movement_delay()
var/tally = 0
if(istype(src, /mob/living/carbon/alien/humanoid/queen))
tally += 4
if(istype(src, /mob/living/carbon/alien/humanoid/drone))
tally += 0
if(istype(src, /mob/living/carbon/alien/humanoid/sentinel))
tally += 0
if(istype(src, /mob/living/carbon/alien/humanoid/hunter))
tally = -2 // hunters go supersuperfast
return (tally + move_delay_add + config.alien_delay)
. = ..()
. += move_delay_add + config.alien_delay //move_delay_add is used to slow aliens with stuns
/mob/living/carbon/alien/humanoid/Process_Spacemove(var/check_drift = 0)
if(..())
@@ -22,7 +22,7 @@
if(slot_l_store)
if(l_store)
return
if(W.w_class > 3)
if(W.w_class > WEIGHT_CLASS_NORMAL)
return
unEquip(W)
l_store = W
@@ -30,7 +30,7 @@
if(slot_r_store)
if(r_store)
return
if(W.w_class > 3)
if(W.w_class > WEIGHT_CLASS_NORMAL)
return
unEquip(W)
r_store = W
@@ -44,4 +44,4 @@
if(slot_l_store)
if(l_store) l_store.attack_alien(src)
if(slot_r_store)
if(r_store) r_store.attack_alien(src)
if(r_store) r_store.attack_alien(src)
@@ -28,6 +28,9 @@
alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
/mob/living/carbon/alien/humanoid/queen/movement_delay()
. = ..()
. += 3
/mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates()
..() //-Yvarov
@@ -26,38 +26,6 @@
..()
//This is fine, works the same as a human
/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(70))
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
..()
if(!( istype(AM, /atom/movable) ))
return
if(!( now_pushing ))
now_pushing = 1
if(!( AM.anchored ))
var/t = get_dir(src, AM)
step(AM, t)
now_pushing = null
return
return
//This needs to be fixed
/mob/living/carbon/alien/larva/Stat()
..()
@@ -14,7 +14,7 @@ var/const/MAX_ACTIVE_TIME = 400
icon = 'icons/mob/alien.dmi'
icon_state = "facehugger"
item_state = "facehugger"
w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4
w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4
throw_range = 5
tint = 3
flags = AIRTIGHT
@@ -249,4 +249,4 @@ var/const/MAX_ACTIVE_TIME = 400
gender = FEMALE
/obj/item/clothing/mask/facehugger/lamarr/New()//to prevent deleting it if aliums are disabled
return
return
+1 -1
View File
@@ -5,7 +5,7 @@
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "biotech=3"
//Revised. Brainmob is now contained directly within object of transfer. MMI in this case.
@@ -4,7 +4,7 @@
max_damage = 200
icon_state = "brain2"
force = 1.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throwforce = 1.0
throw_speed = 3
throw_range = 5
@@ -3,7 +3,7 @@
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
icon = 'icons/obj/assemblies.dmi'
icon_state = "posibrain"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "biotech=3;programming=2"
var/searching = 0
@@ -37,7 +37,7 @@
silenced = !silenced
to_chat(user, "<span class='notice'>You toggle the speaker [silenced ? "off" : "on"].</span>")
if(brainmob && brainmob.key)
to_chat(brainmob, "<span class='warning'>Your internal speaker has been toggled [silenced ? "off" : "on"].</span>")
to_chat(brainmob, "<span class='warning'>Your internal speaker has been toggled [silenced ? "off" : "on"].</span>")
/obj/item/device/mmi/posibrain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
+23
View File
@@ -492,6 +492,29 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
//Throwing stuff
/mob/living/carbon/throw_impact(atom/hit_atom, throwingdatum)
. = ..()
var/hurt = TRUE
/*if(istype(throwingdatum, /datum/thrownthing))
var/datum/thrownthing/D = throwingdatum
if(isrobot(D.thrower))
var/mob/living/silicon/robot/R = D.thrower
if(!R.emagged)
hurt = FALSE*/
if(hit_atom.density && isturf(hit_atom))
if(hurt)
Weaken(1)
take_organ_damage(10)
if(iscarbon(hit_atom) && hit_atom != src)
var/mob/living/carbon/victim = hit_atom
if(hurt)
victim.take_organ_damage(10)
take_organ_damage(10)
victim.Weaken(1)
Weaken(1)
visible_message("<span class='danger'>[src] crashes into [victim], knocking them both over!</span>", "<span class='userdanger'>You violently crash into [victim]!</span>")
playsound(src, 'sound/weapons/punch1.ogg', 50, 1)
/mob/living/carbon/proc/toggle_throw_mode()
if(in_throw_mode)
throw_mode_off()
@@ -1,13 +1,14 @@
/mob/living/carbon/hitby(atom/movable/AM)
if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode
if(canmove && !restrained())
if(istype(AM, /obj/item))
var/obj/item/I = AM
if(isturf(I.loc))
put_in_active_hand(I)
visible_message("<span class='warning'>[src] catches [I]!</span>")
throw_mode_off()
return
/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)
if(!skipcatch)
if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode
if(canmove && !restrained())
if(istype(AM, /obj/item))
var/obj/item/I = AM
if(isturf(I.loc))
put_in_active_hand(I)
visible_message("<span class='warning'>[src] catches [I]!</span>")
throw_mode_off()
return 1
..()
/mob/living/carbon/water_act(volume, temperature, source)
@@ -20,7 +20,6 @@
var/pulse = PULSE_NORM //current pulse level
var/heart_attack = 0
var/wetlevel = 0 //how wet the mob is
var/oxygen_alert = 0
@@ -29,4 +28,4 @@
var/fire_alert = 0
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/co2overloadtime = null
var/co2overloadtime = null
@@ -99,7 +99,7 @@
stat = DEAD
SetDizzy(0)
SetJitter(0)
heart_attack = 0
set_heartattack(FALSE)
//Handle species-specific deaths.
if(species) species.handle_death(src)
+23 -89
View File
@@ -147,93 +147,6 @@
/mob/living/carbon/human/stok/New(var/new_loc)
..(new_loc, "Stok")
/mob/living/carbon/human/Bump(atom/movable/AM, yes)
if(!(yes) || now_pushing || buckled)
return 0
now_pushing = 1
if(ismob(AM))
var/mob/tmob = AM
//BubbleWrap - Should stop you pushing a restrained person out of the way
//i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap'
if(ishuman(tmob))
for(var/mob/M in range(tmob, 1))
if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS))
if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human
to_chat(src, "<span class='danger'>[tmob] is restrained, you cannot push past.</span>")
now_pushing = 0
return 0
//I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had
//locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it
//FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE()
//SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD
if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS)
if(!(world.time % 5))
to_chat(src, "<span class='danger'>[tmob] is restraining [M], you cannot push past.</span>")
now_pushing = 0
return 0
//Leaping mobs just land on the tile, no pushing, no anything.
if(status_flags & LEAPING)
loc = tmob.loc
status_flags &= ~LEAPING
now_pushing = 0
return
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
//it might be 'bubblewrapping' given that this rhymes with 'hugboxing'
if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()))
if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob))
var/turf/oldloc = loc
loc = tmob.loc
tmob.loc = oldloc
now_pushing = 0
for(var/mob/living/carbon/slime/slime in view(1,tmob))
if(slime.Victim == tmob)
slime.UpdateFeed()
return
if(ishuman(tmob) && (FAT in tmob.mutations))
if(prob(40) && !(FAT in src.mutations))
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
//anti-riot equipment is also anti-push
if(tmob.r_hand && (prob(tmob.r_hand.block_chance * 2)) && !istype(tmob.r_hand, /obj/item/clothing))
now_pushing = 0
return
if(tmob.l_hand && (prob(tmob.l_hand.block_chance * 2)) && !istype(tmob.l_hand, /obj/item/clothing))
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
spawn(0)
..()
if(!istype(AM, /atom/movable))
return
if(!now_pushing)
now_pushing = 1
if(!AM.anchored)
var/t = get_dir(src, AM)
if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM, t))
now_pushing = 0
return
step(AM, t)
now_pushing = 0
/mob/living/carbon/human/Stat()
..()
statpanel("Status")
@@ -531,6 +444,17 @@
dat += "<tr><td><B>Head:</B></td><td><A href='?src=[UID()];item=[slot_head]'>[(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A></td></tr>"
var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket)
if(C)
if(slot_wear_mask in obscured)
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>Headpocket:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
var/list/items = C.get_contents()
if(items.len)
dat += "<tr><td>&nbsp;&#8627;<B>Headpocket:</B></td><td><A href='?src=[UID()];dislodge_headpocket=1'>Dislodge Items</A></td></tr>"
else
dat += "<tr><td>&nbsp;&#8627;<B>Headpocket:</B></td><td><font color=grey>Empty</font></td></tr>"
if(slot_wear_mask in obscured)
dat += "<tr><td><font color=grey><B>Mask:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
@@ -759,9 +683,9 @@
if(species)
species_siemens_coeff = species.siemens_coeff
siemens_coeff = gloves_siemens_coeff * species_siemens_coeff
if(heart_attack)
if(undergoing_cardiac_arrest())
if(shock_damage * siemens_coeff >= 1 && prob(25))
heart_attack = 0
set_heartattack(FALSE)
if(stat == CONSCIOUS)
to_chat(src, "<span class='notice'>You feel your heart beating again!</span>")
. = ..()
@@ -826,6 +750,16 @@
var/obj/item/clothing/under/U = w_uniform
U.set_sensors(usr)
if(href_list["dislodge_headpocket"])
usr.visible_message("<span class='danger'>[usr] is trying to remove something from [src]'s head!</span>",
"<span class='danger'>You start to dislodge whatever's inside [src]'s headpocket!</span>")
if(do_mob(usr, src, POCKET_STRIP_DELAY))
usr.visible_message("<span class='danger'>[usr] has dislodged something from [src]'s head!</span>",
"<span class='danger'>You have dislodged everything from [src]'s headpocket!</span>")
var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket)
C.empty_contents()
add_logs(usr, src, "stripped", addition="of headpocket items", print_attack_log=isLivingSSD(src))
if(href_list["strip_accessory"])
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
@@ -313,85 +313,37 @@ emp_act
return 1*/
//this proc handles being hit by a thrown atom
/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5)
/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
var/obj/item/I
var/throwpower = 30
if(istype(AM, /obj/item))
var/obj/item/I = AM
if(in_throw_mode && !get_active_hand() && speed <= 5) //empty active hand and we're in throw mode
if(canmove && !restrained())
if(isturf(I.loc))
put_in_active_hand(I)
visible_message("<span class='warning'>[src] catches [I]!</span>")
throw_mode_off()
return
var/zone = ran_zone("chest", 65)
var/dtype = BRUTE
if(istype(I, /obj/item/weapon))
var/obj/item/weapon/W = I
dtype = W.damtype
var/throw_damage = I.throwforce*(speed/5)
I.throwing = 0 //it hit, so stop moving
if((I.thrower != src) && check_shields(throw_damage, "\the [I.name]", I, THROWN_PROJECTILE_ATTACK))
return
var/obj/item/organ/external/affecting = get_organ(zone)
if(!affecting)
var/missverb = (I.gender == PLURAL) ? "whizz" : "whizzes"
visible_message("<span class='notice'>\The [I] [missverb] past [src]'s missing [parse_zone(zone)]!</span>",
"<span class='notice'>\The [I] [missverb] past your missing [parse_zone(zone)]!</span>")
return
var/hit_area = affecting.name
src.visible_message("<span class='warning'>[src] has been hit in the [hit_area] by [I].</span>")
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here
apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I)
if(ismob(I.thrower))
var/mob/M = I.thrower
if(M)
add_logs(M, src, "hit", I, " (thrown)", print_attack_log = I.throwforce)
//thrown weapon embedded object code.
if(dtype == BRUTE && istype(I))
if(!I.is_robot_module())
I = AM
throwpower = I.throwforce
if(I.thrownby == src) //No throwing stuff at yourself to trigger reactions
return ..()
if(check_shields(throwpower, "\the [AM.name]", AM, THROWN_PROJECTILE_ATTACK))
hitpush = 0
skipcatch = 1
blocked = 1
/*else if(I)
if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD)
if(!I.is_robot_module())
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here
var/sharp = is_sharp(I)
var/damage = throw_damage
var/damage = throwpower * (I.throw_speed / 5)
if(armor)
damage /= armor+1
damage /= armor + 1
//blunt objects should really not be embedding in things unless a huge amount of force is involved
var/embed_chance = sharp? damage/I.w_class : damage/(I.w_class*3)
var/embed_threshold = sharp? 5*I.w_class : 15*I.w_class
var/embed_chance = sharp? damage / I.w_class : damage/(I.w_class * 3)
var/embed_threshold = sharp? 5 * I.w_class : 15 * I.w_class
//Sharp objects will always embed if they do enough damage.
//Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold
if(((sharp && prob(damage/(10*I.w_class)*100)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0))
affecting.embed(I)
// Begin BS12 momentum-transfer code.
if(I.throw_source && speed >= 15)
var/obj/item/weapon/W = I
var/momentum = speed/2
var/dir = get_dir(I.throw_source, src)
visible_message("<span class='warning'>[src] staggers under the impact!</span>","<span class='warning'>You stagger under the impact!</span>")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
if(!W || !src) return
if(W.loc == src && W.sharp) //Projectile is embedded and suitable for pinning.
var/turf/T = near_wall(dir,2)
if(T)
src.loc = T
visible_message("<span class='warning'>[src] is pinned to the wall by [I]!</span>","<span class='warning'>You are pinned to the wall by [I]!</span>")
src.anchored = 1
src.pinned += I
if(((sharp && prob(damage / (10 * I.w_class) * 100)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0))
affecting.embed(I)*/
return ..()
/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2)
@@ -1,67 +1,8 @@
/mob/living/carbon/human/movement_delay()
var/tally = 0
if(species.slowdown)
tally = species.slowdown
if(!has_gravity(src))
return -1 // It's hard to be slowed down in space by... anything
if(flying) return -1
if(embedded_flag)
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
if(slowed)
tally += 10
var/health_deficiency = (maxHealth - health + staminaloss)
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
if(R.shock_reduction)
health_deficiency -= R.shock_reduction
if(health_deficiency >= 40)
tally += (health_deficiency / 25)
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
if(hungry >= 70)
tally += hungry/50
if(wear_suit)
tally += wear_suit.slowdown
if(!buckled)
if(shoes)
tally += shoes.slowdown
if(shock_stage >= 10) tally += 3
if(back)
tally += back.slowdown
if(l_hand && (l_hand.flags & HANDSLOW))
tally += l_hand.slowdown
if(r_hand && (r_hand.flags & HANDSLOW))
tally += r_hand.slowdown
if(FAT in src.mutations)
tally += 1.5
if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
tally += (BODYTEMP_COLD_DAMAGE_LIMIT - bodytemperature) / COLD_SLOWDOWN_FACTOR
tally += 2*stance_damage //damaged/missing feet or legs is slow
if(RUN in mutations)
tally = -1
if(status_flags & IGNORESLOWDOWN) // make sure this is always at the end so we don't have ignore slowdown getting ignored itself
tally = -1
if(status_flags & GOTTAGOFAST)
tally -= 1
if(status_flags & GOTTAGOREALLYFAST)
tally -= 2
return (tally + config.human_delay)
. = 0
. += ..()
. += config.human_delay
. += species.movement_delay(src)
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
@@ -65,7 +65,8 @@
stance_damage = 0
// Buckled to a bed/chair. Stance damage is forced to 0 since they're sitting on something solid
if(istype(buckled, /obj/structure/stool/bed))
// Not standing, so no need to care about stance
if(istype(buckled, /obj/structure/stool/bed) || !isturf(loc))
return
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
@@ -449,7 +449,7 @@
..()
retalTarget(user)
/mob/living/carbon/human/interactive/hitby(atom/movable/AM)
/mob/living/carbon/human/interactive/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
..()
var/mob/living/carbon/C = locate(/mob/living/carbon) in view(SNPC_MIN_RANGE_FIND, src)
if(C)
@@ -546,7 +546,7 @@
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return
if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET))
if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return 1
if(slot_r_store)
if(I.flags & NODROP)
@@ -559,7 +559,7 @@
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return 0
if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET))
if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return 1
return 0
if(slot_s_store)
@@ -575,7 +575,7 @@
if(!disable_warning)
to_chat(src, "You somehow have a suit with no defined allowed items for suit storage, stop that.")
return 0
if(I.w_class > 4)
if(I.w_class > WEIGHT_CLASS_BULKY)
if(!disable_warning)
to_chat(src, "The [name] is too big to attach.")
return 0
+30 -7
View File
@@ -1032,7 +1032,7 @@
if(stat == DEAD)
return PULSE_NONE //that's it, you're dead, nothing can influence your pulse
if(heart_attack)
if(undergoing_cardiac_arrest())
return PULSE_NONE
var/temp = PULSE_NORM
@@ -1175,14 +1175,37 @@
return stuttering
/mob/living/carbon/human/proc/can_heartattack()
if(species.flags & (NO_BLOOD|NO_INTORGANS))
return FALSE
return TRUE
/mob/living/carbon/human/proc/undergoing_cardiac_arrest()
if(!can_heartattack())
return FALSE
var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
if(istype(heart) && heart.beating)
return FALSE
return TRUE
/mob/living/carbon/human/proc/set_heartattack(status)
if(!can_heartattack())
return FALSE
var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
if(!istype(heart))
return FALSE
heart.beating = !status
/mob/living/carbon/human/proc/handle_heartattack()
if(!heart_attack)
if(!can_heartattack() || !undergoing_cardiac_arrest() || reagents.has_reagent("corazone"))
return
else
AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
Paralyse(4)
adjustBruteLoss(2)
AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
Paralyse(4)
adjustBruteLoss(2)
@@ -380,6 +380,72 @@
if(heat_level_3_breathe to INFINITY)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
////////////////
// MOVE SPEED //
////////////////
/datum/species/proc/movement_delay(mob/living/carbon/human/H)
. = 0 //We start at 0.
var/flight = 0 //Check for flight and flying items
var/ignoreslow = 0
var/gravity = 0
if(H.flying)
flight = 1
if((H.status_flags & IGNORESLOWDOWN) || (RUN in H.mutations))
ignoreslow = 1
if(has_gravity(H))
gravity = 1
if(H.embedded_flag)
H.handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
if(!ignoreslow && gravity)
if(slowdown)
. = slowdown
if(H.wear_suit)
. += H.wear_suit.slowdown
if(!H.buckled)
if(H.shoes)
. += H.shoes.slowdown
if(H.back)
. += H.back.slowdown
if(H.l_hand && (H.l_hand.flags & HANDSLOW))
. += H.l_hand.slowdown
if(H.r_hand && (H.r_hand.flags & HANDSLOW))
. += H.r_hand.slowdown
var/health_deficiency = (H.maxHealth - H.health + H.staminaloss)
var/hungry = (500 - H.nutrition)/5 // So overeat would be 100 and default level would be 80
if(H.reagents)
for(var/datum/reagent/R in H.reagents.reagent_list)
if(R.shock_reduction)
health_deficiency -= R.shock_reduction
if(health_deficiency >= 40)
if(flight)
. += (health_deficiency / 75)
else
. += (health_deficiency / 25)
if(H.shock_stage >= 10)
. += 3
. += 2 * H.stance_damage //damaged/missing feet or legs is slow
if((hungry >= 70) && !flight)
. += hungry/50
if(FAT in H.mutations)
. += (1.5 - flight)
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
. += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
if(H.status_flags & GOTTAGOFAST)
. -= 1
if(H.status_flags & GOTTAGOREALLYFAST)
. -= 2
return .
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
grant_abilities(C)
return
@@ -230,7 +230,8 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes //Default darksight of 2.
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
"headpocket" = /obj/item/organ/internal/headpocket
)
suicide_messages = list(
+26 -60
View File
@@ -83,79 +83,45 @@
if(bodytemperature >= 330.23) // 135 F
return -1 // slimes become supercharged at high temperatures
var/tally = 0
. = ..()
var/health_deficiency = (100 - health)
if(health_deficiency >= 45) tally += (health_deficiency / 25)
if(health_deficiency >= 45)
. += (health_deficiency / 25)
if(bodytemperature < 183.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
. += (283.222 - bodytemperature) / 10 * 1.75
if(reagents)
if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down
tally *= 2
. *= 2
if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow
tally *= 5
. *= 5
if(health <= 0) // if damaged, the slime moves twice as slow
tally *= 2
. *= 2
return tally + config.slime_delay
. += config.slime_delay
/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
if((!(yes) || now_pushing))
return
now_pushing = 1
if(isobj(AM))
if(!client && powerlevel > 0)
var/probab = 10
switch(powerlevel)
if(1 to 2) probab = 20
if(3 to 4) probab = 30
if(5 to 6) probab = 40
if(7 to 8) probab = 60
if(9) probab = 70
if(10) probab = 95
if(prob(probab))
if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
if(nutrition <= get_hunger_nutrition() && !Atkcool)
if(is_adult || prob(5))
AM.attack_slime(src)
spawn()
Atkcool = 1
sleep(45)
Atkcool = 0
if(ismob(AM))
var/mob/tmob = AM
if(is_adult)
if(istype(tmob, /mob/living/carbon/human))
if(prob(90))
now_pushing = 0
return
else
if(istype(tmob, /mob/living/carbon/human))
now_pushing = 0
return
now_pushing = 0
..()
if(!istype(AM, /atom/movable))
return
if(!( now_pushing ))
now_pushing = 1
if(!( AM.anchored ))
var/t = get_dir(src, AM)
if(istype(AM, /obj/structure/window))
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
now_pushing = null
/mob/living/carbon/slime/ObjBump(obj/O)
if(!client && powerlevel > 0)
var/chance = 10
switch(powerlevel)
if(1 to 2) chance = 20
if(3 to 4) chance = 30
if(5 to 6) chance = 40
if(7 to 8) chance = 60
if(9) chance = 70
if(10) chance = 95
if(prob(chance))
if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
if(nutrition <= get_hunger_nutrition() && !Atkcool)
if(is_adult || prob(5))
O.attack_slime(src)
Atkcool = 1
spawn(45)
Atkcool = 0
/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0)
return 2
+163 -73
View File
@@ -14,6 +14,121 @@
/mob/living/proc/OpenCraftingMenu()
return
//Generic Bump(). Override MobBump() and ObjBump() instead of this.
/mob/living/Bump(atom/A, yes)
if(..()) //we are thrown onto something
return
if(buckled || !yes || now_pushing)
return
if(ismob(A))
if(MobBump(A))
return
if(isobj(A))
if(ObjBump(A))
return
if(istype(A, /atom/movable))
if(PushAM(A))
return
//Called when we bump into a mob
/mob/living/proc/MobBump(mob/M)
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
if(now_pushing)
return 1
//Should stop you pushing a restrained person out of the way
if(isliving(M))
var/mob/living/L = M
if(L.pulledby && L.pulledby != src && L.restrained())
if(!(world.time % 5))
to_chat(src, "<span class='warning'>[L] is restrained, you cannot push past.</span>")
return 1
if(L.pulling)
if(ismob(L.pulling))
var/mob/P = L.pulling
if(P.restrained())
if(!(world.time % 5))
to_chat(src, "<span class='warning'>[L] is restrained, you cannot push past.</span>")
return 1
if(moving_diagonally) //no mob swap during diagonal moves.
return 1
if(!M.buckled && !M.has_buckled_mobs())
var/mob_swap
//the puller can always swap with it's victim if on grab intent
if(M.pulledby == src && a_intent == I_GRAB)
mob_swap = 1
//restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
else if((M.restrained() || M.a_intent == I_HELP) && (restrained() || a_intent == I_HELP))
mob_swap = 1
if(mob_swap)
//switch our position with M
if(loc && !loc.Adjacent(M.loc))
return 1
now_pushing = 1
var/oldloc = loc
var/oldMloc = M.loc
var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap.
var/src_passmob = (pass_flags & PASSMOB)
M.pass_flags |= PASSMOB
pass_flags |= PASSMOB
M.Move(oldloc)
Move(oldMloc)
if(!src_passmob)
pass_flags &= ~PASSMOB
if(!M_passmob)
M.pass_flags &= ~PASSMOB
now_pushing = 0
return 1
// okay, so we didn't switch. but should we push?
// not if he's not CANPUSH of course
if(!(M.status_flags & CANPUSH))
return 1
//anti-riot equipment is also anti-push
if(M.r_hand && (prob(M.r_hand.block_chance * 2)) && !istype(M.r_hand, /obj/item/clothing))
return 1
if(M.l_hand && (prob(M.l_hand.block_chance * 2)) && !istype(M.l_hand, /obj/item/clothing))
return 1
//Called when we bump into an obj
/mob/living/proc/ObjBump(obj/O)
return
//Called when we want to push an atom/movable
/mob/living/proc/PushAM(atom/movable/AM)
if(now_pushing)
return 1
if(moving_diagonally) // no pushing during diagonal moves
return 1
if(!client && (mob_size < MOB_SIZE_SMALL))
return
if(!AM.anchored)
now_pushing = 1
var/t = get_dir(src, AM)
if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM, t))
now_pushing = 0
return
if(pulling == AM)
stop_pulling()
var/current_dir
if(isliving(AM))
current_dir = AM.dir
step(AM, t)
if(current_dir)
AM.setDir(current_dir)
now_pushing = 0
/mob/living/Stat()
. = ..()
if(. && get_rig_stats)
@@ -377,7 +492,6 @@
if(iscarbon(src))
var/mob/living/carbon/C = src
C.handcuffed = initial(C.handcuffed)
C.heart_attack = 0
for(var/datum/disease/D in C.viruses)
D.cure(0)
@@ -385,6 +499,7 @@
// restore all of the human's blood and reset their shock stage
if(ishuman(src))
human_mob = src
human_mob.set_heartattack(FALSE)
human_mob.restore_blood()
human_mob.shock_stage = 0
human_mob.decaylevel = 0
@@ -430,83 +545,47 @@
else
return 0
var/atom/movable/pullee = pulling
if(pullee && get_dist(src, pullee) > 1)
stop_pulling()
if(pullee && !isturf(pullee.loc) && pullee.loc != loc)
log_game("DEBUG: [src]'s pull on [pullee] was broken despite [pullee] being in [pullee.loc]. Pull stopped manually.")
stop_pulling()
if(restrained())
stop_pulling()
var/t7 = 1
if(restrained())
for(var/mob/living/M in range(src, 1))
if((M.pulling == src && M.stat == 0 && !( M.restrained() )))
t7 = null
if(t7 && pulling && (get_dist(src, pulling) <= 1 || pulling.loc == loc))
var/turf/T = loc
. = ..()
if(pulling && pulling.loc)
if(!( isturf(pulling.loc) ))
stop_pulling()
return
else
if(Debug)
diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]"
diary <<"REPORT THIS"
/////
if(pulling && pulling.anchored)
stop_pulling()
return
if(!restrained())
var/diag = get_dir(src, pulling)
if((diag - 1) & diag)
else
diag = null
if((get_dist(src, pulling) > 1 || diag))
if(isliving(pulling))
var/mob/living/M = pulling
var/ok = 1
if(locate(/obj/item/weapon/grab, M.grabbed_by))
if(prob(75))
var/obj/item/weapon/grab/G = pick(M.grabbed_by)
if(istype(G, /obj/item/weapon/grab))
for(var/mob/O in viewers(M, null))
O.show_message(text("<span class='warning'>[] has been pulled from []'s grip by []</span>", G.affecting, G.assailant, src), 1)
//G = null
qdel(G)
else
ok = 0
if(locate(/obj/item/weapon/grab, M.grabbed_by.len))
ok = 0
if(ok)
var/atom/movable/t = M.pulling
M.stop_pulling()
if(M.lying && (prob(M.getBruteLoss() / 6)))
var/turf/location = M.loc
if(istype(location, /turf/simulated))
location.add_blood(M)
pulling.Move(T, get_dir(pulling, T))
if(M)
M.start_pulling(t)
else
if(pulling)
pulling.Move(T, get_dir(pulling, T))
else
stop_pulling()
. = ..()
if(s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
s_active.close(src)
if(.) // did we actually move?
var/turf/T = loc
. = ..()
if(.)
handle_footstep(loc)
step_count++
if(pulling && pulling == pullee) // we were pulling a thing and didn't lose it during our move.
if(pulling.anchored)
stop_pulling()
return
var/pull_dir = get_dir(src, pulling)
if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) // puller and pullee more than one tile away or in diagonal position
//if(isliving(pulling))
//var/mob/living/M = pulling
//if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth)))
//M.makeTrail(T)
pulling.Move(T, get_dir(pulling, T)) // the pullee tries to reach our previous position
if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
stop_pulling()
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move
pulledby.stop_pulling()
if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
s_active.close(src)
if(update_slimes)
for(var/mob/living/carbon/slime/M in view(1,src))
M.UpdateFeed(src)
/mob/living/proc/handle_footstep(turf/T)
if(istype(T))
return 1
@@ -838,13 +917,24 @@
visible_message("<span class='notice'>[user] butchers [src].</span>")
gib()
/mob/living/movement_delay()
var/tally = 0
/mob/living/movement_delay(ignorewalk = 0)
. = ..()
if(isturf(loc))
var/turf/T = loc
. += T.slowdown
if(slowed)
tally += 10
. += 10
if(ignorewalk)
. += config.run_speed
else
switch(m_intent)
if("run")
if(drowsyness > 0)
. += 6
. += config.run_speed
if("walk")
. += config.walk_speed
return tally
/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G)
if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser() && !issmall(src))
+51 -46
View File
@@ -52,7 +52,7 @@
if(P.dismemberment)
check_projectile_dismemberment(P, def_zone)
return P.on_hit(src, armor, def_zone)
/mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
return 0
@@ -65,60 +65,47 @@
O.emp_act(severity)
..()
/obj/item/proc/get_volume_by_throwforce_and_or_w_class()
if(throwforce && w_class)
return Clamp((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100
else if(w_class)
return Clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100
else
return 0
//this proc handles being hit by a thrown atom
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)//Standardization and logging -Sieve
if(istype(AM, /obj/item))
var/obj/item/I = AM
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
var/dtype = BRUTE
var/dtype = BRUTE
var/volume = I.get_volume_by_throwforce_and_or_w_class()
if(istype(I, /obj/item/weapon))
var/obj/item/weapon/W = I
dtype = W.damtype
if(W.hitsound && W.throwforce > 0)
playsound(loc, W.hitsound, 30, 1, -1)
if(W.throwforce > 0) //If the weapon's throwforce is greater than zero...
if(W.hitsound) //...and hitsound is defined...
playsound(loc, W.hitsound, volume, 1, -1) //...play the weapon's hitsound.
else //Otherwise, if hitsound isn't defined...
playsound(loc, 'sound/weapons/genhit1.ogg', volume, 1, -1) //...play genhit1.ogg.
//run to-hit check here
else if(I.throwforce > 0) //Otherwise, if the item doesn't have a throwhitsound and has a throwforce greater than zero...
playsound(loc, 'sound/weapons/genhit1.ogg', volume, 1, -1)//...play genhit1.ogg
if(!I.throwforce)// Otherwise, if the item's throwforce is 0...
playsound(loc, 'sound/weapons/throwtap.ogg', 1, volume, -1)//...play throwtap.ogg.
if(!blocked)
visible_message("<span class='danger'>[src] has been hit by [I].</span>",
"<span class='userdanger'>[src] has been hit by [I].</span>")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", I.armour_penetration)
apply_damage(I.throwforce, dtype, zone, armor, is_sharp(I), has_edge(I), I)
if(I.thrownby)
add_logs(I.thrownby, src, "hit", I)
else
return 1
else
playsound(loc, 'sound/weapons/genhit1.ogg', 50, 1, -1) //...play genhit1.ogg.)
..()
var/throw_damage = I.throwforce*(speed/5)
src.visible_message("<span class='warning'>[src] has been hit by [I].</span>")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", I.armour_penetration)
apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I)
I.throwing = 0 //it hit, so stop moving
if(ismob(I.thrower))
var/mob/M = I.thrower
if(M)
create_attack_log("<font color='orange'>Has been hit with a [I], thrown by [key_name(M)]</font>")
M.create_attack_log("<font color='red'>Hit [key_name(src)] with a thrown [I]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[key_name_admin(src)] was hit by a [I], thrown by [key_name_admin(M)]")
// Begin BS12 momentum-transfer code.
if(I.throw_source && speed >= 15)
var/obj/item/weapon/W = I
var/momentum = speed/2
var/dir = get_dir(I.throw_source, src)
visible_message("<span class='warning'>[src] staggers under the impact!</span>","<span class='warning'>You stagger under the impact!</span>")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
if(!W || !src) return
if(W.sharp) //Projectile is suitable for pinning.
//Handles embedding for non-humans and simple_animals.
I.loc = src
embedded += I
var/turf/T = near_wall(dir,2)
if(T)
src.loc = T
visible_message("<span class='warning'>[src] is pinned to the wall by [I]!</span>","<span class='warning'>You are pinned to the wall by [I]!</span>")
src.anchored = 1
src.pinned += I
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == I_HARM)
@@ -201,6 +188,24 @@
adjust_fire_stacks(3)
IgniteMob()
//Share fire evenly between the two mobs
//Called in MobBump() and Crossed()
/mob/living/proc/spreadFire(mob/living/L)
if(!istype(L))
return
var/L_old_on_fire = L.on_fire
if(on_fire) //Only spread fire stacks if we're on fire
fire_stacks /= 2
L.fire_stacks += fire_stacks
if(L.IgniteMob())
log_game("[key_name(src)] bumped into [key_name(L)] and set them on fire")
if(L_old_on_fire) //Only ignite us and gain their stacks if they were onfire before we bumped them
L.fire_stacks /= 2
fire_stacks += L.fire_stacks
IgniteMob()
//Mobs on Fire end
/mob/living/water_act(volume, temperature)
+9 -2
View File
@@ -82,6 +82,7 @@
var/current_pda_messaging = null
var/custom_sprite = 0
var/slowdown = 0
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
loc = paicard
@@ -117,6 +118,12 @@
C.toff = 1
..()
/mob/living/silicon/pai/movement_delay()
. = ..()
. += slowdown
. += 1 //A bit slower than humans, so they're easier to smash
. += config.robot_delay
/mob/living/silicon/pai/update_icons()
if(stat == DEAD)
icon_state = "[chassis]_dead"
@@ -539,10 +546,10 @@
card.forceMove(card.loc)
icon_state = "[chassis]"
/mob/living/silicon/pai/Bump(atom/movable/AM as mob|obj, yes)
/mob/living/silicon/pai/Bump()
return
/mob/living/silicon/pai/Bumped(AM as mob|obj)
/mob/living/silicon/pai/Bumped()
return
/mob/living/silicon/pai/start_pulling(var/atom/movable/AM)
@@ -171,7 +171,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throw_speed = 5
throw_range = 10
origin_tech = "magnets=1;biotech=1"
@@ -310,18 +310,15 @@
*/
/mob/living/silicon/robot/drone/Bump(atom/movable/AM as mob|obj, yes)
if(!yes || ( \
!istype(AM,/obj/machinery/door) && \
!istype(AM,/obj/machinery/recharge_station) && \
!istype(AM,/obj/machinery/disposal/deliveryChute) && \
!istype(AM,/obj/machinery/teleport/hub) && \
!istype(AM,/obj/effect/portal)
)) return
..()
return
/mob/living/silicon/robot/drone/Bump(atom/movable/AM, yes)
if(istype(AM, /obj/machinery/door) \
|| istype(AM, /obj/machinery/recharge_station) \
|| istype(AM, /obj/machinery/disposal/deliveryChute) \
|| istype(AM, /obj/machinery/teleport/hub) \
|| istype(AM, /obj/effect/portal))
return ..()
/mob/living/silicon/robot/drone/Bumped(AM as mob|obj)
/mob/living/silicon/robot/drone/Bumped(atom/movable/AM)
return
/mob/living/silicon/robot/drone/start_pulling(var/atom/movable/AM)
@@ -330,7 +327,7 @@
..()
else if(istype(AM,/obj/item))
var/obj/item/O = AM
if(O.w_class > 2)
if(O.w_class > WEIGHT_CLASS_SMALL)
to_chat(src, "<span class='warning'>You are too small to pull that.</span>")
return
else
@@ -552,38 +552,6 @@ var/list/robot_verbs_default = list(
return 2
/mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(20))
to_chat(usr, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
now_pushing = 0
..()
if(!istype(AM, /atom/movable))
return
if(!now_pushing)
now_pushing = 1
if(!AM.anchored)
var/t = get_dir(src, AM)
if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
now_pushing = null
return
return
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
@@ -1,30 +1,24 @@
/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0)
if(ionpulse())
return 1
if(..())
return 1
return 0
//No longer needed, but I'll leave it here incase we plan to re-use it.
/mob/living/silicon/robot/movement_delay()
var/tally = 0 //Incase I need to add stuff other than "speed" later
tally = speed
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
tally-=3
return tally+config.robot_delay
/mob/living/silicon/robot/Move()
..()
/mob/living/silicon/robot/mob_negates_gravity()
return magpulse
/mob/living/silicon/robot/mob_has_gravity()
return ..() || mob_negates_gravity()
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
if(!magpulse)
/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0)
if(ionpulse())
return 1
if(..())
return 1
return 0
//No longer needed, but I'll leave it here incase we plan to re-use it.
/mob/living/silicon/robot/movement_delay()
. = ..()
. += speed
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
. -= 3
. += config.robot_delay
/mob/living/silicon/robot/mob_negates_gravity()
return magpulse
/mob/living/silicon/robot/mob_has_gravity()
return ..() || mob_negates_gravity()
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
if(!magpulse)
return ..()
@@ -195,31 +195,6 @@
src << browse(dat, "window=airoster")
onclose(src, "airoster")
/mob/living/silicon/Bump(atom/movable/AM as mob|obj, yes) //Allows the AI to bump into mobs if it's itself pushed
if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
var/mob/tmob = AM
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
now_pushing = 0
..()
if(!istype(AM, /atom/movable))
return
if(!now_pushing)
now_pushing = 1
if(!AM.anchored)
var/t = get_dir(src, AM)
if(istype(AM, /obj/structure/window))
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
now_pushing = null
/mob/living/silicon/assess_threat() //Secbots won't hunt silicon units
return -10
@@ -10,7 +10,7 @@
throwforce = 5
throw_speed = 2
throw_range = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Cleanbot"
/obj/item/weapon/bucket_sensor/attackby(obj/item/W, mob/user as mob, params)
@@ -204,7 +204,7 @@
throwforce = 10
throw_speed = 2
throw_range = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Floorbot"
/obj/item/weapon/toolbox_tiles_sensor
@@ -216,7 +216,7 @@
throwforce = 10
throw_speed = 2
throw_range = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Floorbot"
/obj/item/weapon/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params)
@@ -286,7 +286,7 @@
var/build_step = 0
var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/treatment_brute = "salglu_solution"
var/treatment_oxy = "salbutamol"
var/treatment_fire = "salglu_solution"
@@ -478,4 +478,4 @@
overlays -= "hs_arm"
new /obj/item/robot_parts/l_arm(get_turf(src))
to_chat(user, "<span class='notice'>You remove the robot arm from [src].</span>")
build_step--
build_step--
@@ -218,8 +218,8 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
if(istype(AM, /obj/item))
var/obj/item/I = AM
if(I.throwforce < src.health && I.thrower && (istype(I.thrower, /mob/living/carbon/human)))
var/mob/living/carbon/human/H = I.thrower
if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
var/mob/living/carbon/human/H = I.thrownby
retaliate(H)
..()
@@ -470,41 +470,6 @@
name = "Corgi meat"
desc = "Tastes like... well you know..."
/mob/living/simple_animal/pet/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(70))
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
..()
if(!( istype(AM, /atom/movable) ))
return
if(!( now_pushing ))
now_pushing = 1
if(!( AM.anchored ))
var/t = get_dir(src, AM)
if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
now_pushing = null
return
return
/mob/living/simple_animal/pet/corgi/regenerate_icons()
overlays.Cut()
if(inventory_head)
@@ -21,7 +21,7 @@
melee_damage_upper = 18
health = 50
maxHealth = 50
speed = 1
speed = 2
//Cargo Sloth

Some files were not shown because too many files have changed in this diff Show More