mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-09 14:15:22 +01:00
Merge branch 'master' into midnight-fluffles
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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>")
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 @@
|
||||
|
||||
|
||||
// ********************************************************************
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, \
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
. = ..()
|
||||
. = ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
. = ..()
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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> ↳<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> ↳<B>Headpocket:</B></td><td><A href='?src=[UID()];dislodge_headpocket=1'>Dislodge Items</A></td></tr>"
|
||||
else
|
||||
dat += "<tr><td> ↳<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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user