mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-23 03:57:48 +01:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into polaris-sync-2018-02-16
# Conflicts: # code/_onclick/hud/screen_objects.dm # code/game/objects/items/weapons/storage/storage.dm # code/game/objects/structures/crates_lockers/closets/secure/medical.dm # code/modules/admin/admin_verbs.dm # code/modules/clothing/clothing.dm # code/modules/clothing/gloves/color.dm # code/modules/lore_codex/codex.dm # code/modules/mob/living/simple_animal/aliens/alien.dm # code/modules/mob/living/simple_animal/animals/cat.dm # code/modules/mob/living/simple_animal/animals/goose.dm # code/modules/mob/living/simple_animal/simple_animal.dm # code/modules/mob/mob_defines.dm # code/modules/projectiles/projectile/special.dm # html/changelogs/.all_changelog.yml # maps/southern_cross/southern_cross-1.dmm # maps/southern_cross/southern_cross-7.dmm # vorestation.dme
This commit is contained in:
@@ -60,7 +60,6 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/check_antagonists,
|
||||
/client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others,
|
||||
/client/proc/dsay, //talk in deadchat using our ckey/fakekey,
|
||||
/client/proc/ghost_view, //let us see ghosts WHENEVERRRR
|
||||
// /client/proc/toggle_hear_deadcast, //toggles whether we hear deadchat,
|
||||
/client/proc/investigate_show, //various admintools for investigation. Such as a singulo grief-log,
|
||||
/client/proc/secrets,
|
||||
@@ -217,7 +216,6 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/jumptomob,
|
||||
/client/proc/jumptocoord,
|
||||
/client/proc/dsay,
|
||||
/client/proc/ghost_view,
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/datum/admins/proc/view_runtimes,
|
||||
@@ -332,7 +330,6 @@ var/list/admin_verbs_mod = list(
|
||||
/datum/admins/proc/show_player_info,
|
||||
/client/proc/player_panel_new,
|
||||
/client/proc/dsay,
|
||||
/client/proc/ghost_view,
|
||||
/datum/admins/proc/show_skills,
|
||||
/datum/admins/proc/show_player_panel,
|
||||
/client/proc/check_antagonists,
|
||||
@@ -357,7 +354,6 @@ var/list/admin_verbs_event_manager = list(
|
||||
/client/proc/admin_ghost,
|
||||
/datum/admins/proc/show_player_info,
|
||||
/client/proc/dsay,
|
||||
/client/proc/ghost_view,
|
||||
/client/proc/cmd_admin_subtle_message,
|
||||
/client/proc/debug_variables,
|
||||
/client/proc/check_antagonists,
|
||||
@@ -497,26 +493,6 @@ var/list/admin_verbs_event_manager = list(
|
||||
body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
|
||||
feedback_add_details("admin_verb","O") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/ghost_view()
|
||||
set category = "Admin"
|
||||
set name = "Ghost View"
|
||||
set desc = "Toggles ability to see ghosts, even while in a mob."
|
||||
if(!holder) return
|
||||
if(!mob.plane_holder) return
|
||||
|
||||
var/choice = alert(src,"Do you want to see ghosts, or not?","Ghost viewing","Show 'em!","Cancel","Hide 'em!")
|
||||
if(choice == "Cancel")
|
||||
return
|
||||
|
||||
if(choice == "Show 'em!" && mob.plane_holder)
|
||||
mob.plane_holder.set_vis(VIS_GHOSTS,TRUE)
|
||||
usr.see_invisible = SEE_INVISIBLE_CULT
|
||||
to_chat(src,"<span class='notice'>Ghosts are now visible (while in this mob).</span>")
|
||||
else if(mob.plane_holder)
|
||||
mob.plane_holder.set_vis(VIS_GHOSTS,FALSE)
|
||||
usr.see_invisible = initial(mob.see_invisible)
|
||||
to_chat(src,"<span class='notice'>Ghosts are now hidden (while in this mob).</span>")
|
||||
|
||||
/client/proc/invisimin()
|
||||
set name = "Invisimin"
|
||||
set category = "Admin"
|
||||
|
||||
@@ -23,12 +23,13 @@
|
||||
var/area/last_name //The last acquired name, used should origin be lost
|
||||
var/area/last_camera_area //The last area in which cameras where fetched, used to see if the camera list should be updated.
|
||||
var/end_time //Used to set when this alarm should clear, in case the origin is lost.
|
||||
var/hidden = FALSE //If this alarm can be seen from consoles or other things.
|
||||
|
||||
/datum/alarm/New(var/atom/origin, var/atom/source, var/duration, var/severity)
|
||||
/datum/alarm/New(var/atom/origin, var/atom/source, var/duration, var/severity, var/hidden)
|
||||
src.origin = origin
|
||||
|
||||
cameras() // Sets up both cameras and last alarm area.
|
||||
set_source_data(source, duration, severity)
|
||||
set_source_data(source, duration, severity, hidden)
|
||||
|
||||
/datum/alarm/proc/process()
|
||||
// Has origin gone missing?
|
||||
@@ -43,17 +44,19 @@
|
||||
AS.duration = 0
|
||||
AS.end_time = world.time + ALARM_RESET_DELAY
|
||||
|
||||
/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity)
|
||||
/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity, var/hidden)
|
||||
var/datum/alarm_source/AS = sources_assoc[source]
|
||||
if(!AS)
|
||||
AS = new/datum/alarm_source(source)
|
||||
sources += AS
|
||||
sources_assoc[source] = AS
|
||||
src.hidden = hidden
|
||||
// Currently only non-0 durations can be altered (normal alarms VS EMP blasts)
|
||||
if(AS.duration)
|
||||
duration = SecondsToTicks(duration)
|
||||
AS.duration = duration
|
||||
AS.severity = severity
|
||||
src.hidden = min(src.hidden, hidden)
|
||||
|
||||
/datum/alarm/proc/clear(var/source)
|
||||
var/datum/alarm_source/AS = sources_assoc[source]
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
A.process()
|
||||
check_alarm_cleared(A)
|
||||
|
||||
/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1)
|
||||
/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1, var/hidden = 0)
|
||||
var/new_alarm
|
||||
//Proper origin and source mandatory
|
||||
if(!(origin && source))
|
||||
@@ -23,9 +23,9 @@
|
||||
//see if there is already an alarm of this origin
|
||||
var/datum/alarm/existing = alarms_assoc[origin]
|
||||
if(existing)
|
||||
existing.set_source_data(source, duration, severity)
|
||||
existing.set_source_data(source, duration, severity, hidden)
|
||||
else
|
||||
existing = new/datum/alarm(origin, source, duration, severity)
|
||||
existing = new/datum/alarm(origin, source, duration, severity, hidden)
|
||||
new_alarm = 1
|
||||
|
||||
alarms |= existing
|
||||
@@ -48,10 +48,10 @@
|
||||
return check_alarm_cleared(existing)
|
||||
|
||||
/datum/alarm_handler/proc/major_alarms()
|
||||
return alarms
|
||||
return visible_alarms()
|
||||
|
||||
/datum/alarm_handler/proc/minor_alarms()
|
||||
return alarms
|
||||
return visible_alarms()
|
||||
|
||||
/datum/alarm_handler/proc/check_alarm_cleared(var/datum/alarm/alarm)
|
||||
if ((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len)
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
/datum/alarm_handler/proc/on_alarm_change(var/datum/alarm/alarm, var/was_raised)
|
||||
for(var/obj/machinery/camera/C in alarm.cameras())
|
||||
if(was_raised)
|
||||
if(was_raised && !alarm.hidden)
|
||||
C.add_network(category)
|
||||
else
|
||||
C.remove_network(category)
|
||||
@@ -95,3 +95,10 @@
|
||||
/datum/alarm_handler/proc/notify_listeners(var/alarm, var/was_raised)
|
||||
for(var/listener in listeners)
|
||||
call(listener, listeners[listener])(src, alarm, was_raised)
|
||||
|
||||
/datum/alarm_handler/proc/visible_alarms()
|
||||
var/list/visible_alarms = new()
|
||||
for(var/datum/alarm/A in alarms)
|
||||
if(!A.hidden)
|
||||
visible_alarms.Add(A)
|
||||
return visible_alarms
|
||||
@@ -1,19 +1,16 @@
|
||||
/datum/alarm_handler/atmosphere
|
||||
category = "Atmosphere Alarms"
|
||||
|
||||
/datum/alarm_handler/atmosphere/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1)
|
||||
..()
|
||||
|
||||
/datum/alarm_handler/atmosphere/major_alarms()
|
||||
var/list/major_alarms = new()
|
||||
for(var/datum/alarm/A in alarms)
|
||||
for(var/datum/alarm/A in visible_alarms())
|
||||
if(A.max_severity() > 1)
|
||||
major_alarms.Add(A)
|
||||
return major_alarms
|
||||
|
||||
/datum/alarm_handler/atmosphere/minor_alarms()
|
||||
var/list/minor_alarms = new()
|
||||
for(var/datum/alarm/A in alarms)
|
||||
for(var/datum/alarm/A in visible_alarms())
|
||||
if(A.max_severity() == 1)
|
||||
minor_alarms.Add(A)
|
||||
return minor_alarms
|
||||
|
||||
@@ -181,27 +181,22 @@
|
||||
/datum/gear/suit/roles/poncho/security
|
||||
display_name = "poncho, security"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/security
|
||||
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
|
||||
|
||||
/datum/gear/suit/roles/poncho/medical
|
||||
display_name = "poncho, medical"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/medical
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/suit/roles/poncho/engineering
|
||||
display_name = "poncho, engineering"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/engineering
|
||||
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer")
|
||||
|
||||
/datum/gear/suit/roles/poncho/science
|
||||
display_name = "poncho, science"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/science
|
||||
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
|
||||
|
||||
/datum/gear/suit/roles/poncho/cargo
|
||||
display_name = "poncho, cargo"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cargo
|
||||
allowed_roles = list("Quartermaster","Cargo Technician")
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/hos
|
||||
display_name = "cloak, head of security"
|
||||
|
||||
@@ -430,6 +430,7 @@
|
||||
P.icon = initial(copy_projectile.icon)
|
||||
P.icon_state = initial(copy_projectile.icon_state)
|
||||
P.pass_flags = initial(copy_projectile.pass_flags)
|
||||
P.fire_sound = initial(copy_projectile.fire_sound)
|
||||
P.hitscan = initial(copy_projectile.hitscan)
|
||||
P.step_delay = initial(copy_projectile.step_delay)
|
||||
P.muzzle_type = initial(copy_projectile.muzzle_type)
|
||||
@@ -451,12 +452,15 @@
|
||||
var/obj/item/weapon/gun/copy = ..()
|
||||
|
||||
flags_inv = copy.flags_inv
|
||||
fire_sound = copy.fire_sound
|
||||
if(copy.fire_sound)
|
||||
fire_sound = copy.fire_sound
|
||||
else
|
||||
fire_sound = null
|
||||
fire_sound_text = copy.fire_sound_text
|
||||
|
||||
var/obj/item/weapon/gun/energy/E = copy
|
||||
if(istype(E))
|
||||
copy_projectile = E.projectile_type
|
||||
var/obj/item/weapon/gun/G = copy
|
||||
if(istype(G))
|
||||
copy_projectile = G.projectile_type
|
||||
//charge_meter = E.charge_meter //does not work very well with icon_state changes, ATM
|
||||
else
|
||||
copy_projectile = null
|
||||
|
||||
@@ -66,10 +66,10 @@
|
||||
|
||||
if(H.species)
|
||||
if(exclusive)
|
||||
if(!(H.species.get_bodytype(H) in species_restricted)) //Vorestation edit
|
||||
if(!(H.species.get_bodytype(H) in species_restricted))
|
||||
wearable = 1
|
||||
else
|
||||
if(H.species.get_bodytype(H) in species_restricted) //Vorestation edit
|
||||
if(H.species.get_bodytype(H) in species_restricted)
|
||||
wearable = 1
|
||||
|
||||
if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store)))
|
||||
@@ -202,8 +202,10 @@
|
||||
var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through
|
||||
var/obj/item/clothing/gloves/ring = null //Covered ring
|
||||
var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping
|
||||
var/glove_level = 2 //What "layer" the glove is on
|
||||
var/overgloves = 0 //Used by gauntlets and arm_guards
|
||||
var/glove_level = 2 //What "layer" the glove is on
|
||||
var/overgloves = 0 //Used by gauntlets and arm_guards
|
||||
var/punch_force = 0 //How much damage do these gloves add to a punch?
|
||||
var/punch_damtype = BRUTE //What type of damage does this make fists be?
|
||||
body_parts_covered = HANDS
|
||||
slot_flags = SLOT_GLOVES
|
||||
attack_verb = list("challenged")
|
||||
@@ -251,7 +253,7 @@
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(slot && slot == slot_gloves)
|
||||
if(istype(H.gloves, /obj/item/clothing/gloves/ring))
|
||||
if(H.gloves)
|
||||
ring = H.gloves
|
||||
if(ring.glove_level >= src.glove_level)
|
||||
to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
|
||||
@@ -261,6 +263,8 @@
|
||||
H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves.
|
||||
ring.forceMove(src)
|
||||
to_chat(user, "You slip \the [src] on over \the [src.ring].")
|
||||
if(!(flags & THICKMATERIAL))
|
||||
punch_force += ring.punch_force
|
||||
else
|
||||
ring = null
|
||||
|
||||
@@ -268,6 +272,7 @@
|
||||
if(ring) //Put the ring back on if the check fails.
|
||||
if(H.equip_to_slot_if_possible(ring, slot_gloves))
|
||||
src.ring = null
|
||||
punch_force = initial(punch_force)
|
||||
return 0
|
||||
|
||||
wearer = H //TODO clean this when magboots are cleaned
|
||||
@@ -284,6 +289,7 @@
|
||||
if(!H.equip_to_slot_if_possible(ring, slot_gloves))
|
||||
ring.forceMove(get_turf(src))
|
||||
src.ring = null
|
||||
punch_force = initial(punch_force)
|
||||
wearer = null
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
@@ -298,6 +304,7 @@
|
||||
siemens_coefficient = 1
|
||||
glove_level = 1
|
||||
fingerprint_chance = 100
|
||||
punch_force = 2
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//Head
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "These arm guards will protect your hands and arms."
|
||||
body_parts_covered = HANDS|ARMS
|
||||
overgloves = 1
|
||||
punch_force = 3
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
desc = "These gloves go over regular gloves."
|
||||
glove_level = 3
|
||||
overgloves = 1
|
||||
punch_force = 5
|
||||
var/obj/item/clothing/gloves/gloves = null //Undergloves
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user)
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
icon_state = "work"
|
||||
item_state = "wgloves"
|
||||
force = 5
|
||||
punch_force = 3
|
||||
siemens_coefficient = 0.75
|
||||
permeability_coefficient = 0.05
|
||||
armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0)
|
||||
@@ -114,3 +115,15 @@
|
||||
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
heat_protection = HANDS
|
||||
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/gloves/knuckledusters
|
||||
name = "knuckle dusters"
|
||||
desc = "A pair of brass knuckles. Generally used to enhance the user's punches."
|
||||
icon_state = "knuckledusters"
|
||||
attack_verb = list("punched", "beaten", "struck")
|
||||
flags = THICKMATERIAL // Stops rings from increasing hit strength
|
||||
siemens_coefficient = 1
|
||||
fingerprint_chance = 100
|
||||
overgloves = 1
|
||||
force = 5
|
||||
punch_force = 5
|
||||
|
||||
@@ -155,15 +155,15 @@
|
||||
name = "streamlined medical voidsuit helmet"
|
||||
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a sleek blue."
|
||||
icon_state = "rig0-medicalalt"
|
||||
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
|
||||
armor = list(melee = 20, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 30)
|
||||
light_overlay = "helmet_light_dual_blue"
|
||||
|
||||
/obj/item/clothing/suit/space/void/medical/alt
|
||||
icon_state = "rig-medicalalt"
|
||||
name = "streamlined medical voidsuit"
|
||||
desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology, without sacrificing comfort or style."
|
||||
desc = "A more recent model of Vey-Med voidsuit, exchanging physical protection for fully unencumbered movement and a complete range of motion."
|
||||
slowdown = 0
|
||||
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
|
||||
armor = list(melee = 20, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 30)
|
||||
|
||||
//Security
|
||||
/obj/item/clothing/head/helmet/space/void/security
|
||||
@@ -243,4 +243,4 @@
|
||||
icon_state = "rig-atmosalt"
|
||||
name = "heavy duty atmos voidsuit"
|
||||
armor = list(melee = 20, bullet = 5, laser = 20,energy = 15, bomb = 45, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
@@ -798,9 +798,6 @@ obj/item/clothing/suit/storage/toggle/peacoat
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
brightness_on = 3
|
||||
light_overlay = "hood_light"
|
||||
action_button_name = "Toggle Head-light"
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
flags = THICKMATERIAL
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
desc = "A comfortable turtleneck and black utility trousers."
|
||||
icon_state = "blackutility"
|
||||
worn_state = "blackutility"
|
||||
rolled_sleeves = 0
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
name = "Daedalus Pocket Newscaster"
|
||||
desc = "A regularly-updating compendium of articles on current events. Essential for new arrivals in the Vir system and anyone interested in politics."
|
||||
icon_state = "newscodex"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
root_type = /datum/lore/codex/category/main_news
|
||||
|
||||
/* //VORESTATION REMOVAL
|
||||
@@ -40,4 +41,4 @@
|
||||
icon_state = "corp_regs"
|
||||
root_type = /datum/lore/codex/category/main_corp_regs
|
||||
throwforce = 5 // Throw the book at 'em.
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
children = list(
|
||||
/datum/lore/codex/page/article1,
|
||||
/datum/lore/codex/page/article2,
|
||||
/datum/lore/codex/page/article3,
|
||||
/datum/lore/codex/page/about_news,
|
||||
)
|
||||
|
||||
@@ -46,3 +47,11 @@
|
||||
incident \"shocking, if the allegations are to be believed\" and has assured shareholders that Nanotrasen will respond to the \
|
||||
incident with as much force as it warrents.<br><br>Requests for a statement directed to the Board of Trustees or Dr. Harper were \
|
||||
not responded to. Free Traders are recommended to stay clear of the region until the situation resolves itself."
|
||||
|
||||
/datum/lore/codex/page/article3
|
||||
name = "2/10/62-- Aetolian Partisans Declare Independence"
|
||||
data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for Prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\
|
||||
<br><br>\
|
||||
Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the Prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the Prometheans, when the Prometheans are perfectly equipped to speak for themselves.\"\
|
||||
<br><br>\
|
||||
NanoTrasen is expected to redouble their Promethean research programs in the Vir system until stability is restored to Vounna."
|
||||
|
||||
@@ -167,4 +167,19 @@
|
||||
|
||||
/material/snow/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
|
||||
recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10)
|
||||
recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15)
|
||||
recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10)
|
||||
recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20)
|
||||
|
||||
/material/snowbrick/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
@@ -269,10 +269,16 @@
|
||||
|
||||
/obj/item/stack/material/snow
|
||||
name = "snow"
|
||||
desc = "The temptation to build a snowfort rises."
|
||||
desc = "The temptation to build a snowman rises."
|
||||
icon_state = "sheet-snow"
|
||||
default_type = "snow"
|
||||
|
||||
/obj/item/stack/material/snowbrick
|
||||
name = "snow brick"
|
||||
desc = "For all of your igloo building needs."
|
||||
icon_state = "sheet-snowbrick"
|
||||
default_type = "packed snow"
|
||||
|
||||
/obj/item/stack/material/leather
|
||||
name = "leather"
|
||||
desc = "The by-product of mob grinding."
|
||||
|
||||
@@ -99,7 +99,7 @@ var/list/name_to_material
|
||||
var/conductivity = null // How conductive the material is. Iron acts as the baseline, at 10.
|
||||
var/list/composite_material // If set, object matter var will be a list containing these values.
|
||||
var/luminescence
|
||||
var/radiation_resistance = 20 // Radiation resistance, used in calculating how much radiation a material absorbs. Equivlent to weight, but does not affect weaponry.
|
||||
var/radiation_resistance = 0 // Radiation resistance, which is added on top of a material's weight for blocking radiation. Needed to make lead special without superrobust weapons.
|
||||
|
||||
// Placeholder vars for the time being, todo properly integrate windows/light tiles/rods.
|
||||
var/created_window
|
||||
@@ -237,7 +237,6 @@ var/list/name_to_material
|
||||
weight = 22
|
||||
stack_origin_tech = list(TECH_MATERIAL = 5)
|
||||
door_icon_base = "stone"
|
||||
radiation_resistance = 80 //dense, so it's okay-ish as rad shielding.
|
||||
|
||||
/material/diamond
|
||||
name = "diamond"
|
||||
@@ -263,7 +262,6 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 4)
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 120 //gold is dense.
|
||||
|
||||
/material/gold/bronze //placeholder for ashtrays
|
||||
name = "bronze"
|
||||
@@ -279,7 +277,7 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 3)
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 22
|
||||
|
||||
//R-UST port
|
||||
/material/supermatter
|
||||
name = "supermatter"
|
||||
@@ -340,7 +338,6 @@ var/list/name_to_material
|
||||
door_icon_base = "stone"
|
||||
sheet_singular_name = "brick"
|
||||
sheet_plural_name = "bricks"
|
||||
radiation_resistance = 22
|
||||
|
||||
/material/stone/marble
|
||||
name = "marble"
|
||||
@@ -349,7 +346,7 @@ var/list/name_to_material
|
||||
hardness = 100
|
||||
integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system
|
||||
stack_type = /obj/item/stack/material/marble
|
||||
radiation_resistance = 26
|
||||
|
||||
|
||||
/material/steel
|
||||
name = DEFAULT_WALL_MATERIAL
|
||||
@@ -396,7 +393,7 @@ var/list/name_to_material
|
||||
conductivity = 13 // For the purposes of balance.
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo
|
||||
radiation_resistance = 60 //Plasteel is presumably dense and is the dominant material used in the engine. Still not great.
|
||||
|
||||
|
||||
// Very rare alloy that is reflective, should be used sparingly.
|
||||
/material/durasteel
|
||||
@@ -414,7 +411,6 @@ var/list/name_to_material
|
||||
reflectivity = 0.7 // Not a perfect mirror, but close.
|
||||
stack_origin_tech = list(TECH_MATERIAL = 8)
|
||||
composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug
|
||||
radiation_resistance = 120 //it reflects XRAY LASERS.
|
||||
|
||||
/material/plasteel/titanium
|
||||
name = "titanium"
|
||||
@@ -443,7 +439,6 @@ var/list/name_to_material
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2)
|
||||
created_window = /obj/structure/window/basic
|
||||
rod_product = /obj/item/stack/material/glass/reinforced
|
||||
radiation_resistance = 15
|
||||
|
||||
/material/glass/build_windows(var/mob/living/user, var/obj/item/stack/used_stack)
|
||||
|
||||
@@ -535,7 +530,6 @@ var/list/name_to_material
|
||||
created_window = /obj/structure/window/reinforced
|
||||
wire_product = null
|
||||
rod_product = null
|
||||
radiation_resistance = 30
|
||||
|
||||
/material/glass/phoron
|
||||
name = "borosilicate glass"
|
||||
@@ -563,7 +557,6 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
composite_material = list() //todo
|
||||
rod_product = null
|
||||
radiation_resistance = 30
|
||||
|
||||
/material/plastic
|
||||
name = "plastic"
|
||||
@@ -578,7 +571,6 @@ var/list/name_to_material
|
||||
conductivity = 2 // For the sake of material armor diversity, we're gonna pretend this plastic is a good insulator.
|
||||
melting_point = T0C+371 //assuming heat resistant plastic
|
||||
stack_origin_tech = list(TECH_MATERIAL = 3)
|
||||
radiation_resistance = 12
|
||||
|
||||
/material/plastic/holographic
|
||||
name = "holoplastic"
|
||||
@@ -629,7 +621,6 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 27
|
||||
|
||||
/material/iron
|
||||
name = "iron"
|
||||
@@ -639,17 +630,16 @@ var/list/name_to_material
|
||||
conductivity = 10
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 22
|
||||
|
||||
/material/lead
|
||||
name = "lead"
|
||||
stack_type = /obj/item/stack/material/lead
|
||||
icon_colour = "#273956"
|
||||
weight = 35
|
||||
weight = 23 // Lead is a bit more dense than silver IRL, and silver has 22 ingame.
|
||||
conductivity = 10
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 350 //actual radiation shielding, yay...
|
||||
radiation_resistance = 25 // Lead is Special and so gets to block more radiation than it normally would with just weight, totalling in 48 protection.
|
||||
|
||||
// Adminspawn only, do not let anyone get this.
|
||||
/material/alienalloy
|
||||
@@ -663,7 +653,6 @@ var/list/name_to_material
|
||||
hardness = 500
|
||||
weight = 500
|
||||
protectiveness = 80 // 80%
|
||||
radiation_resistance = 500
|
||||
|
||||
// Likewise.
|
||||
/material/alienalloy/elevatorium
|
||||
@@ -721,7 +710,6 @@ var/list/name_to_material
|
||||
destruction_desc = "splinters"
|
||||
sheet_singular_name = "plank"
|
||||
sheet_plural_name = "planks"
|
||||
radiation_resistance = 18
|
||||
|
||||
/material/wood/log
|
||||
name = MAT_LOG
|
||||
@@ -765,6 +753,7 @@ var/list/name_to_material
|
||||
door_icon_base = "wood"
|
||||
destruction_desc = "crumples"
|
||||
radiation_resistance = 1
|
||||
|
||||
/material/snow
|
||||
name = MAT_SNOW
|
||||
stack_type = /obj/item/stack/material/snow
|
||||
@@ -782,6 +771,25 @@ var/list/name_to_material
|
||||
sheet_singular_name = "pile"
|
||||
sheet_plural_name = "pile" //Just a bigger pile
|
||||
radiation_resistance = 1
|
||||
|
||||
/material/snowbrick //only slightly stronger than snow, used to make igloos mostly
|
||||
name = "packed snow"
|
||||
flags = MATERIAL_BRITTLE
|
||||
stack_type = /obj/item/stack/material/snowbrick
|
||||
icon_base = "stone"
|
||||
icon_reinf = "reinf_stone"
|
||||
icon_colour = "#D8FDFF"
|
||||
integrity = 50
|
||||
weight = 2
|
||||
hardness = 2
|
||||
protectiveness = 0 // 0%
|
||||
stack_origin_tech = list(TECH_MATERIAL = 1)
|
||||
melting_point = T0C+1
|
||||
destruction_desc = "crumbles"
|
||||
sheet_singular_name = "brick"
|
||||
sheet_plural_name = "bricks"
|
||||
radiation_resistance = 1
|
||||
|
||||
/material/cloth //todo
|
||||
name = "cloth"
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
outgoing_melee_damage_percent = 0.7 // 30% less melee damage.
|
||||
disable_duration_percent = 1.25 // Stuns last 25% longer.
|
||||
slowdown = 1 // Slower.
|
||||
evasion = -1 // 15% easier to hit.
|
||||
evasion = -15 // 15% easier to hit.
|
||||
|
||||
// Tracks number of deaths, one modifier added per cloning
|
||||
/datum/modifier/cloned
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
var/outgoing_melee_damage_percent // Adjusts melee damage inflicted by holder by a percentage. Affects attacks by melee weapons and hand-to-hand.
|
||||
var/slowdown // Negative numbers speed up, positive numbers slow down movement.
|
||||
var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
|
||||
var/evasion // Positive numbers reduce the odds of being hit by 15% each. Negative numbers increase the odds.
|
||||
var/evasion // Positive numbers reduce the odds of being hit. Negative numbers increase the odds.
|
||||
var/bleeding_rate_percent // Adjusts amount of blood lost when bleeding.
|
||||
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Each point makes it 15% easier or harder, just like evasion.
|
||||
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Every 15% is equal to one tile easier or harder, just like evasion.
|
||||
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
|
||||
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
|
||||
var/icon_scale_percent // Makes the holder's icon get scaled up or down.
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
desc = "You're rather inexperienced with guns, you've never used one in your life, or you're just really rusty. \
|
||||
Regardless, you find it quite difficult to land shots where you wanted them to go."
|
||||
|
||||
accuracy = -1
|
||||
accuracy = -15
|
||||
accuracy_dispersion = 1
|
||||
|
||||
/datum/modifier/trait/high_metabolism
|
||||
|
||||
@@ -204,6 +204,9 @@
|
||||
if(istype(thing, /obj/item/toy/plushie/spider)) // Plushies are spooky so people can be assholes with them.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/structure/snowman/spider)) //Snow spiders are also spooky so people can be assholes with those too.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /mob/living/simple_animal/hostile/giant_spider)) // Actual giant spiders are the scariest of them all.
|
||||
var/mob/living/simple_animal/hostile/giant_spider/S = thing
|
||||
if(S.stat == DEAD) // Dead giant spiders are less scary than alive ones.
|
||||
@@ -437,7 +440,7 @@
|
||||
fear_amount += 1
|
||||
if(istype(S.species, /datum/species/shapeshifter/promethean))
|
||||
fear_amount += 4
|
||||
|
||||
|
||||
return fear_amount
|
||||
|
||||
/datum/modifier/trait/phobia/trypanophobe
|
||||
|
||||
@@ -2,20 +2,23 @@
|
||||
name = "unknown"
|
||||
real_name = "unknown"
|
||||
voice_name = "unknown"
|
||||
icon = 'icons/effects/effects.dmi' //We have an ultra-complex update icons that overlays everything, don't load some stupid random male human
|
||||
icon = 'icons/effects/effects.dmi' //We have an ultra-complex update icons that overlays everything, don't load some stupid random male human
|
||||
icon_state = "nothing"
|
||||
|
||||
var/list/hud_list[TOTAL_HUDS]
|
||||
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
|
||||
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
|
||||
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
|
||||
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
|
||||
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
|
||||
|
||||
var/spitting = 0 //Spitting and spitting related things. Any human based ranged attacks, be it innate or added abilities.
|
||||
var/spit_projectile = null //Projectile type.
|
||||
var/spit_name = null //String
|
||||
var/last_spit = 0 //Timestamp.
|
||||
var/spitting = 0 //Spitting and spitting related things. Any human based ranged attacks, be it innate or added abilities.
|
||||
var/spit_projectile = null //Projectile type.
|
||||
var/spit_name = null //String
|
||||
var/last_spit = 0 //Timestamp.
|
||||
|
||||
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
|
||||
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
|
||||
var/hiding = 0 // If the mob is hiding or not. Makes them appear under tables and the like.
|
||||
var/active_regen = FALSE //Used for the regenerate proc in human_powers.dm
|
||||
var/active_regen_delay = 300
|
||||
|
||||
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
|
||||
|
||||
@@ -1095,7 +1098,7 @@
|
||||
var/self = 0
|
||||
|
||||
if(usr.stat || usr.restrained() || !isliving(usr)) return
|
||||
|
||||
|
||||
var/datum/gender/TU = gender_datums[usr.get_visible_gender()]
|
||||
var/datum/gender/T = gender_datums[get_visible_gender()]
|
||||
|
||||
@@ -1358,7 +1361,13 @@
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/slip(var/slipped_on, stun_duration=8)
|
||||
if((species.flags & NO_SLIP) || (shoes && (shoes.item_flags & NOSLIP)))
|
||||
var/list/equipment = list(src.w_uniform,src.wear_suit,src.shoes)
|
||||
var/footcoverage_check = FALSE
|
||||
for(var/obj/item/clothing/C in equipment)
|
||||
if(C.body_parts_covered & FEET)
|
||||
footcoverage_check = TRUE
|
||||
break
|
||||
if((species.flags & NO_SLIP && !footcoverage_check) || (shoes && (shoes.item_flags & NOSLIP))) //Footwear negates a species' natural traction.
|
||||
return 0
|
||||
if(..(slipped_on,stun_duration))
|
||||
return 1
|
||||
@@ -1554,3 +1563,12 @@
|
||||
var/obj/item/clothing/accessory/permit/drone/permit = new(T)
|
||||
permit.set_name(real_name)
|
||||
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
|
||||
|
||||
/mob/living/carbon/human/proc/update_icon_special() //For things such as teshari hiding and whatnot.
|
||||
if(hiding) // Hiding? Carry on.
|
||||
if(stat == DEAD || paralysis || weakened || stunned) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work.
|
||||
hiding = 0 //No hiding for you. Mob layer should be updated naturally, but it actually doesn't.
|
||||
else
|
||||
layer = 2.45
|
||||
else //Replace this else with other variables if added in the future. Alternatively, could make other things effect this hiding variable.
|
||||
return
|
||||
|
||||
@@ -259,7 +259,14 @@
|
||||
return 0
|
||||
|
||||
var/real_damage = rand_damage
|
||||
var/hit_dam_type = attack.damage_type
|
||||
real_damage += attack.get_unarmed_damage(H)
|
||||
if(H.gloves && istype(H.gloves, /obj/item/clothing/gloves))
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
real_damage += G.punch_force
|
||||
hit_dam_type = G.punch_damtype
|
||||
if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN
|
||||
hit_dam_type = AGONY
|
||||
real_damage *= damage_multiplier
|
||||
rand_damage *= damage_multiplier
|
||||
if(HULK in H.mutations)
|
||||
@@ -273,7 +280,7 @@
|
||||
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
|
||||
|
||||
// Finally, apply damage to target
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
apply_damage(real_damage, hit_dam_type, hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
|
||||
if(I_DISARM)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
|
||||
@@ -197,12 +197,6 @@ emp_act
|
||||
if(.) return
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/emp_act(severity)
|
||||
for(var/obj/O in src)
|
||||
if(!O) continue
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/proc/get_accuracy_penalty(mob/living/user)
|
||||
// Certain statuses make it harder to score a hit. These are the same as gun accuracy, however melee doesn't use multiples of 15.
|
||||
var/accuracy_penalty = 0
|
||||
|
||||
@@ -235,33 +235,64 @@
|
||||
|
||||
/mob/living/carbon/human/proc/regenerate()
|
||||
set name = "Regenerate"
|
||||
set desc = "Allows you to regrow limbs and heal organs."
|
||||
set desc = "Allows you to regrow limbs and heal organs after a period of rest."
|
||||
set category = "Abilities"
|
||||
|
||||
if(nutrition < 250)
|
||||
to_chat(src, "<span class='warning'>You lack the biomass regrow anything!</span>")
|
||||
to_chat(src, "<span class='warning'>You lack the biomass to begin regeneration!</span>")
|
||||
return
|
||||
|
||||
nutrition -= 200
|
||||
if(active_regen)
|
||||
to_chat(src, "<span class='warning'>You are already regenerating tissue!</span>")
|
||||
return
|
||||
else
|
||||
active_regen = TRUE
|
||||
src.visible_message("<B>[src]</B>'s flesh begins to mend...")
|
||||
|
||||
for(var/obj/item/organ/I in internal_organs)
|
||||
if(I.damage > 0)
|
||||
I.damage = 0
|
||||
to_chat(src, "<span class='notice'>You feel a soothing sensation within your [I.name]...</span>")
|
||||
var/delay_length = round(active_regen_delay * species.active_regen_mult)
|
||||
if(do_after(src,delay_length))
|
||||
nutrition -= 200
|
||||
|
||||
// Replace completely missing limbs.
|
||||
for(var/limb_type in src.species.has_limbs)
|
||||
var/obj/item/organ/external/E = src.organs_by_name[limb_type]
|
||||
if(E && E.disfigured)
|
||||
E.disfigured = 0
|
||||
if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED))))
|
||||
E.removed()
|
||||
qdel(E)
|
||||
E = null
|
||||
if(!E)
|
||||
var/list/organ_data = src.species.has_limbs[limb_type]
|
||||
var/limb_path = organ_data["path"]
|
||||
var/obj/item/organ/O = new limb_path(src)
|
||||
organ_data["descriptor"] = O.name
|
||||
to_chat(src, "<span class='notice'>You feel a slithering sensation as your [O.name] reform.</span>")
|
||||
update_icons_all()
|
||||
for(var/obj/item/organ/I in internal_organs)
|
||||
if(I.damage > 0)
|
||||
I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ.
|
||||
to_chat(src, "<span class='notice'>You feel a soothing sensation within your [I.name]...</span>")
|
||||
|
||||
// Replace completely missing limbs.
|
||||
for(var/limb_type in src.species.has_limbs)
|
||||
var/obj/item/organ/external/E = src.organs_by_name[limb_type]
|
||||
if(E && E.disfigured)
|
||||
E.disfigured = 0
|
||||
if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED))))
|
||||
E.removed()
|
||||
qdel(E)
|
||||
E = null
|
||||
if(!E)
|
||||
var/list/organ_data = src.species.has_limbs[limb_type]
|
||||
var/limb_path = organ_data["path"]
|
||||
var/obj/item/organ/O = new limb_path(src)
|
||||
organ_data["descriptor"] = O.name
|
||||
to_chat(src, "<span class='notice'>You feel a slithering sensation as your [O.name] reform.</span>")
|
||||
update_icons_all()
|
||||
active_regen = FALSE
|
||||
else
|
||||
to_chat(src, "<span class='critical'>Your regeneration is interrupted!</span>")
|
||||
nutrition -= 75
|
||||
active_regen = FALSE
|
||||
|
||||
/mob/living/carbon/human/proc/hide_humanoid()
|
||||
set name = "Hide"
|
||||
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat == DEAD || paralysis || weakened || stunned) // No hiding if you're stunned!
|
||||
return
|
||||
|
||||
if (!hiding)
|
||||
layer = 2.45 //Just above cables with their 2.44
|
||||
hiding = 1
|
||||
to_chat(src, "<font color='blue'>You are now hiding.</font>")
|
||||
else
|
||||
layer = MOB_LAYER
|
||||
hiding = 0
|
||||
to_chat(src, "<font color='blue'>You have stopped hiding.</font>")
|
||||
|
||||
@@ -164,12 +164,14 @@ This saves us from having to call add_fingerprint() any time something is put in
|
||||
else if (W == r_hand)
|
||||
r_hand = null
|
||||
if(l_hand)
|
||||
l_hand.update_twohanding()
|
||||
l_hand.update_held_icon()
|
||||
update_inv_l_hand()
|
||||
update_inv_r_hand()
|
||||
else if (W == l_hand)
|
||||
l_hand = null
|
||||
if(r_hand)
|
||||
r_hand.update_twohanding()
|
||||
r_hand.update_held_icon()
|
||||
update_inv_l_hand()
|
||||
update_inv_l_hand()
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
blood_color = "#CCCCCC"
|
||||
flesh_color = "#AAAAAA"
|
||||
|
||||
virus_immune = 1
|
||||
|
||||
remains_type = /obj/effect/decal/cleanable/ash
|
||||
death_message = "dissolves into ash..."
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
hunger_factor = 0
|
||||
metabolic_rate = 0
|
||||
|
||||
virus_immune = 1
|
||||
virus_immune = 1
|
||||
|
||||
brute_mod = 1
|
||||
burn_mod = 0
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
var/blood_volume = 560 // Initial blood volume.
|
||||
var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster
|
||||
var/hunger_factor = 0.05 // Multiplier for hunger.
|
||||
var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm
|
||||
|
||||
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
blood_color = "#515573"
|
||||
flesh_color = "#137E8F"
|
||||
|
||||
virus_immune = 1
|
||||
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/internal/brain/golem
|
||||
)
|
||||
|
||||
@@ -39,7 +39,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
virus_immune = 1
|
||||
blood_volume = 560
|
||||
min_age = 1
|
||||
max_age = 5
|
||||
max_age = 10
|
||||
brute_mod = 0.75
|
||||
burn_mod = 2
|
||||
oxy_mod = 0
|
||||
@@ -56,7 +56,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
|
||||
body_temperature = 310.15
|
||||
|
||||
siemens_coefficient = 0.3
|
||||
siemens_coefficient = 0.4
|
||||
rarity_value = 5
|
||||
|
||||
genders = list(MALE, FEMALE, NEUTER, PLURAL)
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/proc/hide
|
||||
/mob/living/carbon/human/proc/hide_humanoid
|
||||
)
|
||||
|
||||
/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
|
||||
speech_chance = 100
|
||||
|
||||
virus_immune = 1
|
||||
|
||||
breath_type = null
|
||||
poison_type = null
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ var/global/list/sparring_attack_cache = list()
|
||||
var/sharp = 0
|
||||
var/edge = 0
|
||||
|
||||
var/deal_halloss
|
||||
var/damage_type = BRUTE
|
||||
var/sparring_variant_type = /datum/unarmed_attack/light_strike
|
||||
|
||||
var/eye_attack_text
|
||||
@@ -131,7 +131,7 @@ var/global/list/sparring_attack_cache = list()
|
||||
/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
var/organ = affecting.name
|
||||
|
||||
|
||||
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
|
||||
var/datum/gender/TT = gender_datums[target.get_visible_gender()]
|
||||
|
||||
@@ -258,10 +258,10 @@ var/global/list/sparring_attack_cache = list()
|
||||
if(5) user.visible_message("<span class='danger'>[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed [TU.his] [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!</span>") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
|
||||
|
||||
/datum/unarmed_attack/light_strike
|
||||
deal_halloss = 3
|
||||
attack_noun = list("tap","light strike")
|
||||
attack_verb = list("tapped", "lightly struck")
|
||||
damage = 2
|
||||
damage = 3
|
||||
damage_type = AGONY
|
||||
shredding = 0
|
||||
damage = 0
|
||||
sharp = 0
|
||||
|
||||
@@ -179,6 +179,9 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
//5: Set appearance once
|
||||
appearance = ma_compiled
|
||||
|
||||
//6: Do any species specific layering updates, such as when hiding.
|
||||
update_icon_special()
|
||||
|
||||
/mob/living/carbon/human/update_transform(var/mutable_appearance/passed_ma)
|
||||
if(QDESTROYING(src))
|
||||
return
|
||||
@@ -216,6 +219,7 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
M.Translate(0, 16*(desired_scale-1))
|
||||
ma.transform = M
|
||||
ma.layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
|
||||
update_icon_special() //Adjust their layer, like when they are hiding.
|
||||
|
||||
if(!passed_ma)
|
||||
appearance = ma
|
||||
@@ -252,6 +256,25 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
list_huds = hud_list.Copy()
|
||||
list_huds += backplane // Required to mask HUDs in context menus: http://www.byond.com/forum/?post=2336679
|
||||
|
||||
//TYPING INDICATOR CODE.
|
||||
if(client && !stat) //They have a client & aren't dead/KO'd? Continue on!
|
||||
if(typing_indicator && hud_typing) //They already have the indicator and are still typing
|
||||
overlays += typing_indicator //This might not be needed? It works, so I'm leaving it.
|
||||
list_huds += typing_indicator
|
||||
typing_indicator.invisibility = invisibility
|
||||
|
||||
else if(!typing_indicator && hud_typing) //Are they in their body, NOT dead, have hud_typing, do NOT have a typing indicator. and have it enabled?
|
||||
typing_indicator = new
|
||||
typing_indicator.icon = 'icons/mob/talk.dmi'
|
||||
typing_indicator.icon_state = "[speech_bubble_appearance()]_typing"
|
||||
overlays += typing_indicator
|
||||
list_huds += typing_indicator
|
||||
|
||||
else if(typing_indicator && !hud_typing) //Did they stop typing?
|
||||
overlays -= typing_indicator
|
||||
typing = 0
|
||||
hud_typing = 0
|
||||
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
|
||||
|
||||
@@ -23,6 +23,13 @@
|
||||
var/datum/disease2/disease/V = M.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
else if(istype(O,/obj/effect/decal/cleanable/vomit))
|
||||
var/obj/effect/decal/cleanable/vomit/Vom = O
|
||||
if(Vom.virus2.len)
|
||||
for (var/ID in Vom.virus2)
|
||||
var/datum/disease2/disease/V = Vom.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
if(virus2.len)
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
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/lastpuke = 0
|
||||
|
||||
var/evasion = 0 // Makes attacks harder to land. Each number equals 15% more likely to miss. Negative numbers increase hit chance.
|
||||
var/evasion = 0 // Makes attacks harder to land. Negative numbers increase hit chance.
|
||||
var/force_max_speed = 0 // If 1, the mob runs extremely fast and cannot be slowed.
|
||||
|
||||
var/image/dsoverlay = null //Overlay used for darksight eye adjustments
|
||||
|
||||
@@ -445,6 +445,11 @@
|
||||
|
||||
toggle(mob/living/silicon/pai/user)
|
||||
user.secHUD = !user.secHUD
|
||||
user.plane_holder.set_vis(VIS_CH_ID, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_WANTED, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_IMPTRACK, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_IMPLOYAL, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_IMPCHEM, user.secHUD)
|
||||
|
||||
is_active(mob/living/silicon/pai/user)
|
||||
return user.secHUD
|
||||
@@ -456,6 +461,8 @@
|
||||
|
||||
toggle(mob/living/silicon/pai/user)
|
||||
user.medHUD = !user.medHUD
|
||||
user.plane_holder.set_vis(VIS_CH_STATUS, user.medHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_HEALTH, user.medHUD)
|
||||
|
||||
is_active(mob/living/silicon/pai/user)
|
||||
return user.medHUD
|
||||
|
||||
@@ -58,7 +58,8 @@
|
||||
/obj/item/weapon/reagent_containers/glass,
|
||||
/obj/item/weapon/storage/pill_bottle,
|
||||
/obj/item/weapon/reagent_containers/pill,
|
||||
/obj/item/weapon/reagent_containers/blood
|
||||
/obj/item/weapon/reagent_containers/blood,
|
||||
/obj/item/stack/material/phoron
|
||||
)
|
||||
|
||||
/obj/item/weapon/gripper/research //A general usage gripper, used for toxins/robotics/xenobio/etc
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
return 1
|
||||
|
||||
/mob/living/silicon/robot/handle_regular_hud_updates()
|
||||
|
||||
var/fullbright = FALSE
|
||||
if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY))
|
||||
src.sight |= SEE_TURFS
|
||||
src.sight |= SEE_MOBS
|
||||
@@ -164,18 +164,22 @@
|
||||
src.sight |= SEE_MOBS
|
||||
src.see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
fullbright = TRUE
|
||||
else if (src.sight_mode & BORGMESON)
|
||||
src.sight |= SEE_TURFS
|
||||
src.see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
fullbright = TRUE
|
||||
else if (src.sight_mode & BORGMATERIAL)
|
||||
src.sight |= SEE_OBJS
|
||||
src.see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
fullbright = TRUE
|
||||
else if (src.sight_mode & BORGTHERM)
|
||||
src.sight |= SEE_MOBS
|
||||
src.see_in_dark = 8
|
||||
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
fullbright = TRUE
|
||||
else if (!seedarkness)
|
||||
src.sight &= ~SEE_MOBS
|
||||
src.sight &= ~SEE_TURFS
|
||||
@@ -189,7 +193,7 @@
|
||||
src.see_in_dark = 8 // see_in_dark means you can FAINTLY see in the dark, humans have a range of 3 or so, tajaran have it at 8
|
||||
src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness
|
||||
// has a "invisible" value of 15
|
||||
|
||||
plane_holder.set_vis(VIS_FULLBRIGHT,fullbright)
|
||||
..()
|
||||
|
||||
if (src.healths)
|
||||
|
||||
@@ -246,10 +246,19 @@ var/global/list/robot_modules = list(
|
||||
src.modules += N
|
||||
src.modules += B
|
||||
|
||||
/obj/item/weapon/robot_module/medical/robot/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
/obj/item/weapon/robot_module/robot/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
|
||||
if(src.emag)
|
||||
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
|
||||
PS.reagents.add_reagent("pacid", 2 * amount)
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/medical/crisis
|
||||
@@ -503,6 +512,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/melee/baton/robot(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/taser/xeno/sec/robot(src)
|
||||
src.modules += new /obj/item/taperoll/police(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src)
|
||||
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
|
||||
@@ -750,6 +760,18 @@ var/global/list/robot_modules = list(
|
||||
C.synths = list(wire)
|
||||
src.modules += C
|
||||
|
||||
/obj/item/weapon/robot_module/robot/research/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/robot/security/combat
|
||||
name = "combat robot module"
|
||||
hide_on_manifest = 1
|
||||
|
||||
@@ -182,3 +182,13 @@
|
||||
src.modules += O
|
||||
src.modules += B
|
||||
src.modules += S
|
||||
|
||||
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
..()
|
||||
@@ -322,6 +322,8 @@
|
||||
/mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised)
|
||||
if(!next_alarm_notice)
|
||||
next_alarm_notice = world.time + SecondsToTicks(10)
|
||||
if(alarm.hidden)
|
||||
return
|
||||
|
||||
var/list/alarms = queued_alarms[alarm_handler]
|
||||
if(was_raised)
|
||||
|
||||
@@ -137,106 +137,4 @@
|
||||
/mob/living/simple_animal/hostile/alien/death()
|
||||
..()
|
||||
visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...")
|
||||
playsound(src, 'sound/voice/hiss6.ogg', 100, 1)
|
||||
|
||||
// Xenoarch aliens.
|
||||
/mob/living/simple_animal/hostile/samak
|
||||
name = "samak"
|
||||
desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain."
|
||||
faction = "samak"
|
||||
icon_state = "samak"
|
||||
icon_living = "samak"
|
||||
icon_dead = "samak_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "samak"
|
||||
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
speed = 2
|
||||
move_to_delay = 2
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
|
||||
attacktext = list("mauled")
|
||||
cold_damage_per_tick = 0
|
||||
|
||||
speak_chance = 5
|
||||
speak = list("Hruuugh!","Hrunnph")
|
||||
emote_see = list("paws the ground","shakes its mane","stomps")
|
||||
emote_hear = list("snuffles")
|
||||
|
||||
/mob/living/simple_animal/hostile/diyaab
|
||||
name = "diyaab"
|
||||
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
|
||||
faction = "diyaab"
|
||||
icon_state = "diyaab"
|
||||
icon_living = "diyaab"
|
||||
icon_dead = "diyaab_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "diyaab"
|
||||
cooperative = 1
|
||||
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
speed = 1
|
||||
move_to_delay = 1
|
||||
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 8
|
||||
|
||||
attacktext = list("gouged")
|
||||
cold_damage_per_tick = 0
|
||||
|
||||
speak_chance = 5
|
||||
speak = list("Awrr?","Aowrl!","Worrl")
|
||||
emote_see = list("sniffs the air cautiously","looks around")
|
||||
emote_hear = list("snuffles")
|
||||
|
||||
/mob/living/simple_animal/hostile/shantak
|
||||
name = "shantak"
|
||||
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though."
|
||||
faction = "shantak"
|
||||
icon_state = "shantak"
|
||||
icon_living = "shantak"
|
||||
icon_dead = "shantak_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "shantak"
|
||||
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
speed = 1
|
||||
move_to_delay = 1
|
||||
|
||||
melee_damage_lower = 3
|
||||
melee_damage_upper = 12
|
||||
|
||||
attacktext = list("gouged")
|
||||
cold_damage_per_tick = 0
|
||||
|
||||
speak_chance = 5
|
||||
speak = list("Shuhn","Shrunnph?","Shunpf")
|
||||
emote_see = list("scratches the ground","shakes out its mane","clinks gently as it moves")
|
||||
|
||||
/mob/living/simple_animal/yithian
|
||||
name = "yithian"
|
||||
desc = "A friendly creature vaguely resembling an oversized snail without a shell."
|
||||
icon_state = "yithian"
|
||||
icon_living = "yithian"
|
||||
icon_dead = "yithian_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "yithian"
|
||||
|
||||
/mob/living/simple_animal/tindalos
|
||||
name = "tindalos"
|
||||
desc = "It looks like a large, flightless grasshopper."
|
||||
icon_state = "tindalos"
|
||||
icon_living = "tindalos"
|
||||
icon_dead = "tindalos_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "tindalos"
|
||||
playsound(src, 'sound/voice/hiss6.ogg', 100, 1)
|
||||
@@ -25,6 +25,7 @@
|
||||
projectiletype = /obj/item/projectile/beam/drone
|
||||
projectilesound = 'sound/weapons/laser3.ogg'
|
||||
destroy_surroundings = 0
|
||||
hovering = TRUE
|
||||
|
||||
//Drones aren't affected by atmos.
|
||||
min_oxy = 0
|
||||
@@ -275,3 +276,10 @@
|
||||
|
||||
/obj/item/projectile/beam/pulse/drone
|
||||
damage = 10
|
||||
|
||||
// A slightly easier drone, for POIs.
|
||||
// Difference is that it should not be faster than you.
|
||||
/mob/living/simple_animal/hostile/malf_drone/lesser
|
||||
desc = "An automated combat drone with an aged apperance."
|
||||
returns_home = TRUE
|
||||
move_to_delay = 6
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
faction = "carp"
|
||||
intelligence_level = SA_ANIMAL
|
||||
hovering = TRUE
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
speed = 4
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
//Sif Crabs
|
||||
/mob/living/simple_animal/giant_crab
|
||||
name = "Giant Crab"
|
||||
name = "giant crab"
|
||||
desc = "A large, hard-shelled crustacean. This one is mostly grey."
|
||||
icon_state = "sif_crab"
|
||||
icon_living = "sif_crab"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/mob/living/simple_animal/yithian
|
||||
name = "yithian"
|
||||
desc = "A friendly creature vaguely resembling an oversized snail without a shell."
|
||||
icon_state = "yithian"
|
||||
icon_living = "yithian"
|
||||
icon_dead = "yithian_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "yithian"
|
||||
|
||||
/mob/living/simple_animal/tindalos
|
||||
name = "tindalos"
|
||||
desc = "It looks like a large, flightless grasshopper."
|
||||
icon_state = "tindalos"
|
||||
icon_living = "tindalos"
|
||||
icon_dead = "tindalos_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "tindalos"
|
||||
@@ -0,0 +1,27 @@
|
||||
/mob/living/simple_animal/retaliate/diyaab
|
||||
name = "diyaab"
|
||||
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
|
||||
faction = "diyaab"
|
||||
icon_state = "diyaab"
|
||||
icon_living = "diyaab"
|
||||
icon_dead = "diyaab_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "diyaab"
|
||||
cooperative = 1
|
||||
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
speed = 1
|
||||
move_to_delay = 1
|
||||
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 8
|
||||
|
||||
attacktext = "gouged"
|
||||
cold_damage_per_tick = 0
|
||||
|
||||
speak_chance = 5
|
||||
speak = list("Awrr?","Aowrl!","Worrl")
|
||||
emote_see = list("sniffs the air cautiously","looks around")
|
||||
emote_hear = list("snuffles")
|
||||
@@ -0,0 +1,32 @@
|
||||
/mob/living/simple_animal/hostile/savik
|
||||
name = "savik"
|
||||
desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain."
|
||||
faction = "savik"
|
||||
icon_state = "savik"
|
||||
icon_living = "savik"
|
||||
icon_dead = "savik_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "savik"
|
||||
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
speed = 2
|
||||
move_to_delay = 2
|
||||
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 25
|
||||
|
||||
attacktext = "mauled"
|
||||
cold_damage_per_tick = 0
|
||||
|
||||
speak_chance = 5
|
||||
speak = list("Hruuugh!","Hrunnph")
|
||||
emote_see = list("paws the ground","shakes its mane","stomps")
|
||||
emote_hear = list("snuffles")
|
||||
|
||||
/mob/living/simple_animal/hostile/savik/handle_stance(var/new_stance)
|
||||
..(new_stance)
|
||||
if(stance == STANCE_ATTACK || stance == STANCE_ATTACKING)
|
||||
if((health / maxHealth) <= 0.5) // At half health, and fighting someone currently.
|
||||
add_modifier(/datum/modifier/berserk, 30 SECONDS)
|
||||
@@ -0,0 +1,25 @@
|
||||
/mob/living/simple_animal/hostile/shantak
|
||||
name = "shantak"
|
||||
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though."
|
||||
faction = "shantak"
|
||||
icon_state = "shantak"
|
||||
icon_living = "shantak"
|
||||
icon_dead = "shantak_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
faction = "shantak"
|
||||
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
speed = 1
|
||||
move_to_delay = 1
|
||||
|
||||
melee_damage_lower = 3
|
||||
melee_damage_upper = 12
|
||||
|
||||
attacktext = "gouged"
|
||||
cold_damage_per_tick = 0
|
||||
|
||||
speak_chance = 5
|
||||
speak = list("Shuhn","Shrunnph?","Shunpf")
|
||||
emote_see = list("scratches the ground","shakes out its mane","clinks gently as it moves")
|
||||
@@ -8,6 +8,7 @@
|
||||
response_disarm = "flailed at"
|
||||
response_harm = "punched"
|
||||
intelligence_level = SA_HUMANOID // Player controlled.
|
||||
hovering = TRUE
|
||||
icon_dead = "shade_dead"
|
||||
speed = -1
|
||||
a_intent = I_HURT
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/simple_animal/hostile/mecha
|
||||
name = "syndicate gygax"
|
||||
name = "mercenary gygax"
|
||||
desc = "Well that's forboding."
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "darkgygax"
|
||||
@@ -96,6 +96,8 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/mecha/malf_drone
|
||||
name = "autonomous mechanized drone"
|
||||
desc = "It appears to be an exosuit, piloted by a drone intelligence. It looks scary."
|
||||
intelligence_level = SA_ROBOTIC
|
||||
faction = "malf_drone"
|
||||
speak_chance = 1
|
||||
@@ -110,6 +112,7 @@
|
||||
say_cannot = list("Denied.", "Negative.")
|
||||
say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
|
||||
say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
|
||||
returns_home = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/mecha/malf_drone/isSynthetic()
|
||||
return TRUE
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
projectiletype = /obj/item/projectile/bullet/pistol/medium
|
||||
casingtype = /obj/item/ammo_casing/spent
|
||||
// casingtype = /obj/item/ammo_casing/spent //Makes infinite stacks of bullets when put in PoIs.
|
||||
projectilesound = 'sound/weapons/Gunshot_light.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100)
|
||||
@@ -168,6 +168,7 @@
|
||||
icon_state = "viscerator_attack"
|
||||
icon_living = "viscerator_attack"
|
||||
intelligence_level = SA_ROBOTIC
|
||||
hovering = TRUE
|
||||
|
||||
faction = "syndicate"
|
||||
maxHealth = 15
|
||||
|
||||
@@ -584,6 +584,12 @@
|
||||
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
|
||||
ai_log("bullet_act() I was shot by: [Proj.firer]",2)
|
||||
|
||||
/* VOREStation Edit - Ace doesn't like bonus SA damage.
|
||||
//Projectiles with bonus SA damage
|
||||
if(!Proj.nodamage)
|
||||
if(!Proj.SA_vulnerability || Proj.SA_vulnerability == intelligence_level)
|
||||
Proj.damage += Proj.SA_bonus_damage
|
||||
*/ // VOREStation Edit End
|
||||
. = ..()
|
||||
|
||||
if(Proj.firer)
|
||||
@@ -1292,6 +1298,7 @@
|
||||
|
||||
if(A.attack_generic(src, damage_to_do, pick(attacktext)) && attack_sound)
|
||||
playsound(src, attack_sound, 75, 1)
|
||||
|
||||
return TRUE
|
||||
|
||||
//The actual top-level ranged attack proc
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
|
||||
if(!plane_holder) //Lazy
|
||||
plane_holder = new(src) //Not a location, it takes it and saves it.
|
||||
if(!vis_enabled)
|
||||
vis_enabled = list()
|
||||
client.screen += plane_holder.plane_masters
|
||||
recalculate_vis()
|
||||
|
||||
@@ -145,7 +145,6 @@
|
||||
/mob/proc/Life()
|
||||
// if(organStructure)
|
||||
// organStructure.ProcessOrgans()
|
||||
//handle_typing_indicator() //You said the typing indicator would be fine. The test determined that was a lie.
|
||||
return
|
||||
|
||||
#define UNBUCKLED 0
|
||||
|
||||
@@ -220,10 +220,15 @@
|
||||
|
||||
var/get_rig_stats = 0 //Moved from computer.dm
|
||||
|
||||
|
||||
var/hud_typing = 0 //Typing indicator stuff.
|
||||
var/typing //Simple mobs use this variable.
|
||||
var/obj/effect/decal/typing_indicator
|
||||
|
||||
var/low_priority = FALSE //Skip processing life() if there's just no players on this Z-level
|
||||
|
||||
var/default_pixel_x = 0 //For offsetting mobs
|
||||
var/default_pixel_y = 0
|
||||
|
||||
var/attack_icon //Icon to use when attacking w/o anything in-hand
|
||||
var/attack_icon_state //State for above
|
||||
var/attack_icon_state //State for above
|
||||
|
||||
@@ -15,6 +15,11 @@
|
||||
/proc/mob_size_difference(var/mob_size_A, var/mob_size_B)
|
||||
return round(log(2, mob_size_A/mob_size_B), 1)
|
||||
|
||||
/mob/proc/can_wield_item(obj/item/W)
|
||||
if(W.w_class >= ITEMSIZE_LARGE && issmall(src))
|
||||
return FALSE //M is too small to wield this
|
||||
return TRUE
|
||||
|
||||
/proc/istiny(A)
|
||||
if(A && istype(A, /mob/living))
|
||||
var/mob/living/L = A
|
||||
|
||||
@@ -1,13 +1,4 @@
|
||||
#define TYPING_INDICATOR_LIFETIME 30 * 10 //grace period after which typing indicator disappears regardless of text in chatbar
|
||||
|
||||
mob/var/hud_typing = 0 //set when typing in an input window instead of chatline
|
||||
mob/var/typing
|
||||
mob/var/last_typed
|
||||
mob/var/last_typed_time
|
||||
|
||||
mob/var/obj/effect/decal/typing_indicator
|
||||
|
||||
/mob/proc/set_typing_indicator(var/state)
|
||||
/mob/proc/set_typing_indicator(var/state) //Leaving this here for mobs.
|
||||
|
||||
if(!typing_indicator)
|
||||
typing_indicator = new
|
||||
@@ -35,11 +26,17 @@ mob/var/obj/effect/decal/typing_indicator
|
||||
set name = ".Say"
|
||||
set hidden = 1
|
||||
|
||||
set_typing_indicator(1)
|
||||
hud_typing = 1
|
||||
if(!ishuman(src)) //If they're a mob, use the old code.
|
||||
set_typing_indicator(1)
|
||||
if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
|
||||
hud_typing = 1
|
||||
update_icons_huds()
|
||||
var/message = input("","say (text)") as text
|
||||
hud_typing = 0
|
||||
set_typing_indicator(0)
|
||||
if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
|
||||
hud_typing = 0
|
||||
update_icons_huds()
|
||||
if(!ishuman(src)) //If they're a mob, use the old code.
|
||||
set_typing_indicator(0)
|
||||
if(message)
|
||||
say_verb(message)
|
||||
|
||||
@@ -47,29 +44,16 @@ mob/var/obj/effect/decal/typing_indicator
|
||||
set name = ".Me"
|
||||
set hidden = 1
|
||||
|
||||
set_typing_indicator(1)
|
||||
hud_typing = 1
|
||||
if(!ishuman(src)) //If they're a mob, use the old code.
|
||||
set_typing_indicator(1)
|
||||
if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
|
||||
hud_typing = 1
|
||||
update_icons_huds()
|
||||
var/message = input("","me (text)") as text
|
||||
hud_typing = 0
|
||||
set_typing_indicator(0)
|
||||
if(is_preference_enabled(/datum/client_preference/show_typing_indicator))
|
||||
hud_typing = 0
|
||||
update_icons_huds()
|
||||
if(!ishuman(src)) //If they're a mob, use the old code.
|
||||
set_typing_indicator(0)
|
||||
if(message)
|
||||
me_verb(message)
|
||||
|
||||
/mob/proc/handle_typing_indicator()
|
||||
if(is_preference_enabled(/datum/client_preference/show_typing_indicator) && !hud_typing)
|
||||
var/temp = winget(client, "input", "text")
|
||||
|
||||
if (temp != last_typed)
|
||||
last_typed = temp
|
||||
last_typed_time = world.time
|
||||
|
||||
if (world.time > last_typed_time + TYPING_INDICATOR_LIFETIME)
|
||||
set_typing_indicator(0)
|
||||
return
|
||||
if(length(temp) > 5 && findtext(temp, "Say \"", 1, 7))
|
||||
set_typing_indicator(1)
|
||||
else if(length(temp) > 3 && findtext(temp, "Me ", 1, 5))
|
||||
set_typing_indicator(1)
|
||||
|
||||
else
|
||||
set_typing_indicator(0)
|
||||
@@ -377,6 +377,13 @@
|
||||
/turf/simulated/open/check_impact(var/atom/movable/falling_atom)
|
||||
return FALSE
|
||||
|
||||
// Or actual space.
|
||||
/turf/space/CheckFall(var/atom/movable/falling_atom)
|
||||
return FALSE
|
||||
|
||||
/turf/space/check_impact(var/atom/movable/falling_atom)
|
||||
return FALSE
|
||||
|
||||
// We return 1 without calling fall_impact in order to provide a soft landing. So nice.
|
||||
// Note this really should never even get this far
|
||||
/obj/structure/stairs/CheckFall(var/atom/movable/falling_atom)
|
||||
@@ -407,7 +414,7 @@
|
||||
A.fall_impact(hit_atom, damage_min, damage_max, silent = TRUE)
|
||||
|
||||
// Take damage from falling and hitting the ground
|
||||
/mob/living/fall_impact(var/atom/hit_atom, var/damage_min = 0, var/damage_max = 10, var/silent = FALSE, var/planetary = FALSE)
|
||||
/mob/living/fall_impact(var/atom/hit_atom, var/damage_min = 0, var/damage_max = 5, var/silent = FALSE, var/planetary = FALSE)
|
||||
var/turf/landing = get_turf(hit_atom)
|
||||
if(planetary && src.CanParachute())
|
||||
if(!silent)
|
||||
@@ -532,14 +539,12 @@
|
||||
"You hear something slam into \the [landing].")
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
|
||||
// Now to hurt everything in the mech (if the fall is planetary, the mech blows up, so we do this first)
|
||||
for(var/atom/movable/A in src.contents)
|
||||
A.fall_impact(hit_atom, damage_min, damage_max, silent = TRUE)
|
||||
// And now the Mech
|
||||
|
||||
// And now to hurt the mech.
|
||||
if(!planetary)
|
||||
take_damage(rand(damage_min, damage_max))
|
||||
else
|
||||
for(var/atom/movable/A in src.contents)
|
||||
A.fall_impact(hit_atom, damage_min, damage_max, silent = TRUE)
|
||||
qdel(src)
|
||||
|
||||
// And hurt the floor.
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
/datum/nano_module/alarm_monitor/proc/all_alarms()
|
||||
var/list/all_alarms = new()
|
||||
for(var/datum/alarm_handler/AH in alarm_handlers)
|
||||
all_alarms += AH.alarms
|
||||
all_alarms += AH.visible_alarms()
|
||||
|
||||
return all_alarms
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
|
||||
// TODO: Move these to a cache, similar to cameras
|
||||
for(var/obj/machinery/alarm/alarm in (monitored_alarms.len ? monitored_alarms : machines))
|
||||
if(!monitored_alarms.len && alarm.alarms_hidden)
|
||||
continue
|
||||
alarms[++alarms.len] = list(
|
||||
"name" = sanitize(alarm.name),
|
||||
"ref"= "\ref[alarm]",
|
||||
|
||||
@@ -93,3 +93,7 @@
|
||||
|
||||
/obj/item/organ/internal/eyes/proc/additional_flash_effects(var/intensity)
|
||||
return -1
|
||||
|
||||
/obj/item/organ/internal/eyes/emp_act(severity)
|
||||
..() //Returns if the organ isn't robotic
|
||||
owner.eye_blurry += (4/severity)
|
||||
@@ -17,6 +17,9 @@
|
||||
owner.stat = 0
|
||||
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
|
||||
|
||||
/obj/item/organ/internal/cell/emp_act(severity)
|
||||
..()
|
||||
owner.nutrition = max(0, owner.nutrition - rand(10/severity, 50/severity))
|
||||
|
||||
// Used for an MMI or posibrain being installed into a human.
|
||||
/obj/item/organ/internal/mmi_holder
|
||||
@@ -84,6 +87,10 @@
|
||||
holder_mob.drop_from_inventory(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/organ/internal/mmi_holder/emp_act(severity)
|
||||
..()
|
||||
owner.adjustToxLoss(rand(6/severity, 12/severity))
|
||||
|
||||
/obj/item/organ/internal/mmi_holder/posibrain
|
||||
name = "positronic brain interface"
|
||||
brain_type = /obj/item/device/mmi/digital/posibrain
|
||||
|
||||
@@ -35,6 +35,50 @@
|
||||
var/const/signfont = "Times New Roman"
|
||||
var/const/crayonfont = "Comic Sans MS"
|
||||
|
||||
/obj/item/weapon/paper/card
|
||||
name = "blank card"
|
||||
desc = "A gift card with space to write on the cover."
|
||||
icon_state = "greetingcard"
|
||||
slot_flags = null //no fun allowed!!!!
|
||||
|
||||
/obj/item/weapon/paper/card/AltClick() //No fun allowed
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/card/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/card/smile
|
||||
name = "happy card"
|
||||
desc = "A gift card with a smiley face on the cover."
|
||||
icon_state = "greetingcard_smile"
|
||||
|
||||
/obj/item/weapon/paper/card/cat
|
||||
name = "cat card"
|
||||
desc = "A gift card with a cat on the cover."
|
||||
icon_state = "greetingcard_cat"
|
||||
|
||||
/obj/item/weapon/paper/card/flower
|
||||
name = "flower card"
|
||||
desc = "A gift card with a flower on the cover."
|
||||
icon_state = "greetingcard_flower"
|
||||
|
||||
/obj/item/weapon/paper/card/heart
|
||||
name = "heart card"
|
||||
desc = "A gift card with a heart on the cover."
|
||||
icon_state = "greetingcard_heart"
|
||||
|
||||
/obj/item/weapon/paper/card/New()
|
||||
..()
|
||||
pixel_y = rand(-8, 8)
|
||||
pixel_x = rand(-9, 9)
|
||||
stamps = null
|
||||
|
||||
if(info != initial(info))
|
||||
info = html_encode(info)
|
||||
info = replacetext(info, "\n", "<BR>")
|
||||
info = parsepencode(info)
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/alien
|
||||
name = "alien tablet"
|
||||
desc = "It looks highly advanced"
|
||||
@@ -319,7 +363,7 @@
|
||||
if(P.lit && !user.restrained())
|
||||
if(istype(P, /obj/item/weapon/flame/lighter/zippo))
|
||||
class = "rose"
|
||||
|
||||
|
||||
user.visible_message("<span class='[class]'>[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!</span>", \
|
||||
"<span class='[class]'>You hold \the [P] up to \the [src], burning it slowly.</span>")
|
||||
|
||||
|
||||
+11
-11
@@ -174,7 +174,7 @@ datum/weather/sif
|
||||
temp_high = T0C // 0c
|
||||
temp_low = 243.15 // -30c
|
||||
light_modifier = 0.5
|
||||
flight_falure_modifier = 5
|
||||
flight_failure_modifier = 5
|
||||
transition_chances = list(
|
||||
WEATHER_LIGHT_SNOW = 20,
|
||||
WEATHER_SNOW = 50,
|
||||
@@ -198,7 +198,7 @@ datum/weather/sif
|
||||
temp_high = 243.15 // -30c
|
||||
temp_low = 233.15 // -40c
|
||||
light_modifier = 0.3
|
||||
flight_falure_modifier = 10
|
||||
flight_failure_modifier = 10
|
||||
transition_chances = list(
|
||||
WEATHER_SNOW = 45,
|
||||
WEATHER_BLIZZARD = 40,
|
||||
@@ -232,7 +232,7 @@ datum/weather/sif
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
return // They're indoors, so no need to rain on them.
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
L.water_act(1)
|
||||
to_chat(L, "<span class='warning'>Rain falls on you.</span>")
|
||||
@@ -243,7 +243,7 @@ datum/weather/sif
|
||||
temp_high = 243.15 // -30c
|
||||
temp_low = 233.15 // -40c
|
||||
light_modifier = 0.3
|
||||
flight_falure_modifier = 10
|
||||
flight_failure_modifier = 10
|
||||
transition_chances = list(
|
||||
WEATHER_RAIN = 45,
|
||||
WEATHER_STORM = 40,
|
||||
@@ -256,7 +256,7 @@ datum/weather/sif
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
return // They're indoors, so no need to rain on them.
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
L.water_act(2)
|
||||
to_chat(L, "<span class='warning'>Rain falls on you, drenching you in water.</span>")
|
||||
@@ -267,7 +267,7 @@ datum/weather/sif
|
||||
temp_high = T0C // 0c
|
||||
temp_low = 243.15 // -30c
|
||||
light_modifier = 0.3
|
||||
flight_falure_modifier = 15
|
||||
flight_failure_modifier = 15
|
||||
transition_chances = list(
|
||||
WEATHER_RAIN = 45,
|
||||
WEATHER_STORM = 10,
|
||||
@@ -280,17 +280,17 @@ datum/weather/sif
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
return // They're indoors, so no need to pelt them with ice.
|
||||
continue // They're indoors, so no need to pelt them with ice.
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = L.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = L.get_armor_soak(target_zone, "melee")
|
||||
|
||||
if(amount_blocked >= 100)
|
||||
return // No need to apply damage.
|
||||
continue // No need to apply damage.
|
||||
|
||||
if(amount_soaked >= 10)
|
||||
return // No need to apply damage.
|
||||
continue // No need to apply damage.
|
||||
|
||||
L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
|
||||
to_chat(L, "<span class='warning'>The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!</span>")
|
||||
@@ -299,7 +299,7 @@ datum/weather/sif
|
||||
name = "blood moon"
|
||||
light_modifier = 0.5
|
||||
light_color = "#FF0000"
|
||||
flight_falure_modifier = 25
|
||||
flight_failure_modifier = 25
|
||||
transition_chances = list(
|
||||
WEATHER_BLOODMOON = 100
|
||||
)
|
||||
)
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
var/temp_low = T0C
|
||||
var/light_modifier = 1.0 // Lower numbers means more darkness.
|
||||
var/light_color = null // If set, changes how the day/night light looks.
|
||||
var/flight_falure_modifier = 0 // Some types of weather make flying harder, and therefore make crashes more likely.
|
||||
var/flight_failure_modifier = 0 // Some types of weather make flying harder, and therefore make crashes more likely.
|
||||
var/transition_chances = list() // Assoc list
|
||||
var/datum/weather_holder/holder = null
|
||||
|
||||
|
||||
@@ -56,6 +56,9 @@
|
||||
/obj/machinery/power/apc/hyper
|
||||
cell_type = /obj/item/weapon/cell/hyper
|
||||
|
||||
/obj/machinery/power/apc/alarms_hidden
|
||||
alarms_hidden = TRUE
|
||||
|
||||
/obj/machinery/power/apc
|
||||
name = "area power controller"
|
||||
desc = "A control terminal for the area electrical systems."
|
||||
@@ -112,6 +115,7 @@
|
||||
var/global/list/status_overlays_equipment
|
||||
var/global/list/status_overlays_lighting
|
||||
var/global/list/status_overlays_environ
|
||||
var/alarms_hidden = FALSE //If power alarms from this APC are visible on consoles
|
||||
|
||||
/obj/machinery/power/apc/updateDialog()
|
||||
if (stat & (BROKEN|MAINT))
|
||||
@@ -223,6 +227,10 @@
|
||||
src.area = get_area_name(areastring)
|
||||
name = "\improper [area.name] APC"
|
||||
area.apc = src
|
||||
|
||||
if(istype(area, /area/submap))
|
||||
alarms_hidden = TRUE
|
||||
|
||||
update_icon()
|
||||
|
||||
make_terminal()
|
||||
@@ -1108,7 +1116,7 @@
|
||||
equipment = autoset(equipment, 0)
|
||||
lighting = autoset(lighting, 0)
|
||||
environ = autoset(environ, 0)
|
||||
power_alarm.triggerAlarm(loc, src)
|
||||
power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
|
||||
autoflag = 0
|
||||
|
||||
// update icon & area power if anything changed
|
||||
@@ -1138,21 +1146,21 @@
|
||||
equipment = autoset(equipment, 2)
|
||||
lighting = autoset(lighting, 1)
|
||||
environ = autoset(environ, 1)
|
||||
power_alarm.triggerAlarm(loc, src)
|
||||
power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
|
||||
autoflag = 2
|
||||
else if(cell.percent() <= 15) // <15%, turn off lighting & equipment
|
||||
if((autoflag > 1 && longtermpower < 0) || (autoflag > 1 && longtermpower >= 0))
|
||||
equipment = autoset(equipment, 2)
|
||||
lighting = autoset(lighting, 2)
|
||||
environ = autoset(environ, 1)
|
||||
power_alarm.triggerAlarm(loc, src)
|
||||
power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
|
||||
autoflag = 1
|
||||
else // zero charge, turn all off
|
||||
if(autoflag != 0)
|
||||
equipment = autoset(equipment, 0)
|
||||
lighting = autoset(lighting, 0)
|
||||
environ = autoset(environ, 0)
|
||||
power_alarm.triggerAlarm(loc, src)
|
||||
power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
|
||||
autoflag = 0
|
||||
|
||||
// val 0=off, 1=off(auto) 2=on 3=on(auto)
|
||||
|
||||
@@ -214,6 +214,7 @@
|
||||
terminal = new /obj/machinery/power/terminal(tempLoc)
|
||||
terminal.set_dir(tempDir)
|
||||
terminal.master = src
|
||||
terminal.connect_to_network()
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -265,7 +266,6 @@
|
||||
user.visible_message(\
|
||||
"<span class='notice'>[user.name] has added cables to the [src].</span>",\
|
||||
"<span class='notice'>You added cables to the [src].</span>")
|
||||
terminal.connect_to_network()
|
||||
stat = 0
|
||||
return 0
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// BUILDABLE SMES(Superconducting Magnetic Energy Storage) UNIT
|
||||
//
|
||||
// Last Change 1.26.2018 by Neerti. Also signing this is dumb.
|
||||
// Last Change 2.8.2018 by Neerti. Also signing this is still dumb.
|
||||
//
|
||||
// This is subtype of SMES that should be normally used. It can be constructed, deconstructed and hacked.
|
||||
// It also supports RCON System which allows you to operate it remotely, if properly set.
|
||||
@@ -8,7 +8,7 @@
|
||||
//MAGNETIC COILS - These things actually store and transmit power within the SMES. Different types have different
|
||||
/obj/item/weapon/smes_coil
|
||||
name = "superconductive magnetic coil"
|
||||
desc = "Standard superconductive magnetic coil with average capacity and I/O rating."
|
||||
desc = "The standard superconductive magnetic coil, with average capacity and I/O rating."
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "smes_coil" // Just few icons patched together. If someone wants to make better icon, feel free to do so!
|
||||
w_class = ITEMSIZE_LARGE // It's LARGE (backpack size)
|
||||
@@ -18,21 +18,21 @@
|
||||
// 20% Charge Capacity, 60% I/O Capacity. Used for substation/outpost SMESs.
|
||||
/obj/item/weapon/smes_coil/weak
|
||||
name = "basic superconductive magnetic coil"
|
||||
desc = "Cheaper model of standard superconductive magnetic coil. It's capacity and I/O rating are considerably lower."
|
||||
desc = "A cheaper model of superconductive magnetic coil. Its capacity and I/O rating are considerably lower."
|
||||
ChargeCapacity = 1200000 // 20 kWh
|
||||
IOCapacity = 150000 // 150 kW
|
||||
|
||||
// 1000% Charge Capacity, 20% I/O Capacity
|
||||
/obj/item/weapon/smes_coil/super_capacity
|
||||
name = "superconductive capacitance coil"
|
||||
desc = "Specialised version of standard superconductive magnetic coil. This one has significantly stronger containment field, allowing for significantly larger power storage. It's IO rating is much lower, however."
|
||||
desc = "A specialised type of superconductive magnetic coil with a significantly stronger containment field, allowing for larger power storage. Its IO rating is much lower, however."
|
||||
ChargeCapacity = 60000000 // 1000 kWh
|
||||
IOCapacity = 50000 // 50 kW
|
||||
|
||||
// 10% Charge Capacity, 400% I/O Capacity. Technically turns SMES into large super capacitor.Ideal for shields.
|
||||
/obj/item/weapon/smes_coil/super_io
|
||||
name = "superconductive transmission coil"
|
||||
desc = "Specialised version of standard superconductive magnetic coil. While this one won't store almost any power, it rapidly transfers power, making it useful in systems which require large throughput."
|
||||
desc = "A specialised type of superconductive magnetic coil with reduced storage capabilites but vastly improved power transmission capabilities, making it useful in systems which require large throughput."
|
||||
ChargeCapacity = 600000 // 10 kWh
|
||||
IOCapacity = 1000000 // 1000 kW
|
||||
|
||||
@@ -58,7 +58,11 @@
|
||||
// Pre-installed and pre-charged SMES hidden from the station, for use in submaps.
|
||||
/obj/machinery/power/smes/buildable/point_of_interest/New()
|
||||
..(1)
|
||||
charge = 1e6 // Should be enough for an individual POI.
|
||||
charge = 1e7 // Should be enough for an individual POI.
|
||||
RCon = FALSE
|
||||
input_level = input_level_max
|
||||
output_level = output_level_max
|
||||
input_attempt = TRUE
|
||||
|
||||
|
||||
|
||||
@@ -106,7 +110,7 @@
|
||||
if(RCon)
|
||||
..()
|
||||
else // RCON wire cut
|
||||
usr << "<span class='warning'>Connection error: Destination Unreachable.</span>"
|
||||
to_chat(usr, "<span class='warning'>Connection error: Destination Unreachable.</span>")
|
||||
|
||||
// Cyborgs standing next to the SMES can play with the wiring.
|
||||
if(istype(usr, /mob/living/silicon/robot) && Adjacent(usr) && open_hatch)
|
||||
@@ -118,7 +122,7 @@
|
||||
/obj/machinery/power/smes/buildable/New(var/install_coils = 1)
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/stack/cable_coil(src,30)
|
||||
src.wires = new /datum/wires/smes(src)
|
||||
wires = new /datum/wires/smes(src)
|
||||
|
||||
// Allows for mapped-in SMESs with larger capacity/IO
|
||||
if(install_coils)
|
||||
@@ -149,13 +153,12 @@
|
||||
output_level_max += C.IOCapacity
|
||||
charge = between(0, charge, capacity)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
// Proc: total_system_failure()
|
||||
// Parameters: 2 (intensity - how strong the failure is, user - person which caused the failure)
|
||||
// Description: Checks the sensors for alerts. If change (alerts cleared or detected) occurs, calls for icon update.
|
||||
/obj/machinery/power/smes/buildable/proc/total_system_failure(var/intensity = 0, var/mob/user as mob)
|
||||
/obj/machinery/power/smes/buildable/proc/total_system_failure(var/intensity = 0, var/mob/user)
|
||||
// SMESs store very large amount of power. If someone screws up (ie: Disables safeties and attempts to modify the SMES) very bad things happen.
|
||||
// Bad things are based on charge percentage.
|
||||
// Possible effects:
|
||||
@@ -169,11 +172,9 @@
|
||||
if (!intensity)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/h_user = null
|
||||
if (!istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/h_user = user
|
||||
if (!istype(h_user))
|
||||
return
|
||||
else
|
||||
h_user = user
|
||||
|
||||
|
||||
// Preparations
|
||||
@@ -187,97 +188,92 @@
|
||||
log_game("SMES FAILURE: <b>[src.x]X [src.y]Y [src.z]Z</b> User: [usr.ckey], Intensity: [intensity]/100")
|
||||
message_admins("SMES FAILURE: <b>[src.x]X [src.y]Y [src.z]Z</b> User: [usr.ckey], Intensity: [intensity]/100 - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>")
|
||||
|
||||
var/used_hand = h_user.hand?"l_hand":"r_hand"
|
||||
|
||||
switch (intensity)
|
||||
if (0 to 15)
|
||||
// Small overcharge
|
||||
// Sparks, Weak shock
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
if (user_protected && prob(80))
|
||||
h_user << "Small electrical arc almost burns your hand. Luckily you had your gloves on!"
|
||||
to_chat(h_user, "A small electrical arc almost burns your hand. Luckily you had your gloves on!")
|
||||
else
|
||||
h_user << "Small electrical arc sparks and burns your hand as you touch the [src]!"
|
||||
h_user.adjustFireLoss(rand(5,10))
|
||||
h_user.Paralyse(2)
|
||||
charge = 0
|
||||
to_chat(h_user, "A small electrical arc sparks and burns your hand as you touch the [src]!")
|
||||
h_user.adjustFireLossByPart(rand(5,10), used_hand)
|
||||
h_user.Weaken(2)
|
||||
|
||||
if (16 to 35)
|
||||
// Medium overcharge
|
||||
// Sparks, Medium shock, Weak EMP
|
||||
s.set_up(4,1,src)
|
||||
s.start()
|
||||
if (user_protected && prob(25))
|
||||
h_user << "Medium electrical arc sparks and almost burns your hand. Luckily you had your gloves on!"
|
||||
to_chat(h_user, "A medium electrical arc sparks and almost burns your hand. Luckily you had your gloves on!")
|
||||
else
|
||||
h_user << "Medium electrical sparks as you touch the [src], severely burning your hand!"
|
||||
h_user.adjustFireLoss(rand(10,25))
|
||||
h_user.Paralyse(5)
|
||||
spawn(0)
|
||||
empulse(src.loc, 1, 2, 3, 4)
|
||||
charge = 0
|
||||
to_chat(h_user, "A medium electrical arc sparks as you touch the [src], severely burning your hand!")
|
||||
h_user.adjustFireLossByPart(rand(10,25), used_hand)
|
||||
h_user.Weaken(5)
|
||||
spawn()
|
||||
empulse(get_turf(src), 1, 2, 3, 4)
|
||||
|
||||
if (36 to 60)
|
||||
// Strong overcharge
|
||||
// Sparks, Strong shock, Strong EMP, 10% light overload. 1% APC failure
|
||||
s.set_up(7,1,src)
|
||||
s.start()
|
||||
if (user_protected)
|
||||
h_user << "Strong electrical arc sparks between you and [src], ignoring your gloves and burning your hand!"
|
||||
h_user.adjustFireLoss(rand(25,60))
|
||||
h_user.Paralyse(8)
|
||||
to_chat(h_user, "A strong electrical arc sparks between you and [src], ignoring your gloves and burning your hand!")
|
||||
h_user.adjustFireLossByPart(rand(25,60), used_hand)
|
||||
h_user.Weaken(8)
|
||||
else
|
||||
h_user << "Strong electrical arc sparks between you and [src], knocking you out for a while!"
|
||||
h_user.adjustFireLoss(rand(35,75))
|
||||
h_user.Paralyse(12)
|
||||
spawn(0)
|
||||
empulse(src.loc, 6, 8, 12, 16)
|
||||
charge = 0
|
||||
to_chat(h_user, "A strong electrical arc sparks between you and [src], knocking you out for a while!")
|
||||
h_user.electrocute_act(rand(35,75), src, def_zone = BP_TORSO)
|
||||
spawn()
|
||||
empulse(get_turf(src), 6, 8, 12, 16)
|
||||
apcs_overload(1, 10)
|
||||
src.ping("Caution. Output regulators malfunction. Uncontrolled discharge detected.")
|
||||
ping("Caution. Output regulator malfunction. Uncontrolled discharge detected.")
|
||||
|
||||
if (61 to INFINITY)
|
||||
// Massive overcharge
|
||||
// Sparks, Near - instantkill shock, Strong EMP, 25% light overload, 5% APC failure. 50% of SMES explosion. This is bad.
|
||||
s.set_up(10,1,src)
|
||||
s.start()
|
||||
h_user << "Massive electrical arc sparks between you and [src]. Last thing you can think about is \"Oh shit...\""
|
||||
to_chat(h_user, "A massive electrical arc sparks between you and [src]. The last thing you can think about is \"Oh shit...\"")
|
||||
// Remember, we have few gigajoules of electricity here.. Turn them into crispy toast.
|
||||
h_user.adjustFireLoss(rand(150,195))
|
||||
h_user.Paralyse(25)
|
||||
spawn(0)
|
||||
empulse(src.loc, 32, 64)
|
||||
charge = 0
|
||||
h_user.electrocute_act(rand(150,195), src, def_zone = BP_TORSO)
|
||||
spawn()
|
||||
empulse(get_turf(src), 32, 64)
|
||||
apcs_overload(5, 25)
|
||||
src.ping("Caution. Output regulators malfunction. Significant uncontrolled discharge detected.")
|
||||
ping("Caution. Output regulator malfunction. Significant uncontrolled discharge detected.")
|
||||
|
||||
if (prob(50))
|
||||
// Added admin-notifications so they can stop it when griffed.
|
||||
log_game("SMES explosion imminent.")
|
||||
message_admins("SMES explosion imminent.")
|
||||
src.ping("DANGER! Magnetic containment field unstable! Containment field failure imminent!")
|
||||
ping("DANGER! Magnetic containment field unstable! Containment field failure imminent!")
|
||||
failing = 1
|
||||
update_icon()
|
||||
// 30 - 60 seconds and then BAM!
|
||||
spawn(rand(300,600))
|
||||
if(!failing) // Admin can manually set this var back to 0 to stop overload, for use when griffed.
|
||||
update_icon()
|
||||
src.ping("Magnetic containment stabilised.")
|
||||
ping("Magnetic containment stabilised.")
|
||||
return
|
||||
src.ping("DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...")
|
||||
explosion(src.loc,1,2,4,8)
|
||||
ping("DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...")
|
||||
explosion(get_turf(src),1,2,4,8)
|
||||
// Not sure if this is necessary, but just in case the SMES *somehow* survived..
|
||||
qdel(src)
|
||||
|
||||
s.start()
|
||||
charge = 0
|
||||
|
||||
|
||||
|
||||
// Proc: apcs_overload()
|
||||
// Parameters: 2 (failure_chance - chance to actually break the APC, overload_chance - Chance of breaking lights)
|
||||
// Description: Damages output powernet by power surge. Destroys few APCs and lights, depending on parameters.
|
||||
/obj/machinery/power/smes/buildable/proc/apcs_overload(var/failure_chance, var/overload_chance)
|
||||
if (!src.powernet)
|
||||
if (!powernet)
|
||||
return
|
||||
|
||||
for(var/obj/machinery/power/terminal/T in src.powernet.nodes)
|
||||
for(var/obj/machinery/power/terminal/T in powernet.nodes)
|
||||
if(istype(T.master, /obj/machinery/power/apc))
|
||||
var/obj/machinery/power/apc/A = T.master
|
||||
if (prob(overload_chance))
|
||||
@@ -301,7 +297,7 @@
|
||||
/obj/machinery/power/smes/buildable/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
// No more disassembling of overloaded SMESs. You broke it, now enjoy the consequences.
|
||||
if (failing)
|
||||
user << "<span class='warning'>The [src]'s screen is flashing with alerts. It seems to be overloaded! Touching it now is probably not a good idea.</span>"
|
||||
to_chat(user, "<span class='warning'>The [src]'s indicator lights are flashing wildly. It seems to be overloaded! Touching it now is probably not a good idea.</span>")
|
||||
return
|
||||
// If parent returned 1:
|
||||
// - Hatch is open, so we can modify the SMES
|
||||
@@ -313,15 +309,15 @@
|
||||
var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text
|
||||
if(newtag)
|
||||
RCon_tag = newtag
|
||||
user << "<span class='notice'>You changed the RCON tag to: [newtag]</span>"
|
||||
to_chat(user, "<span class='notice'>You changed the RCON tag to: [newtag]</span>")
|
||||
return
|
||||
// Charged above 1% and safeties are enabled.
|
||||
if((charge > (capacity/100)) && safeties_enabled)
|
||||
user << "<span class='warning'>Safety circuit of [src] is preventing modifications while it's charged!</span>"
|
||||
to_chat(user, "<span class='warning'>The safety circuit of [src] is preventing modifications while there is charge stored!</span>")
|
||||
return
|
||||
|
||||
if (output_attempt || input_attempt)
|
||||
user << "<span class='warning'>Turn off the [src] first!</span>"
|
||||
to_chat(user, "<span class='warning'>Turn off the [src] first!</span>")
|
||||
return
|
||||
|
||||
// Probability of failure if safety circuit is disabled (in %)
|
||||
@@ -334,29 +330,19 @@
|
||||
// Crowbar - Disassemble the SMES.
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
if (terminal)
|
||||
user << "<span class='warning'>You have to disassemble the terminal first!</span>"
|
||||
to_chat(user, "<span class='warning'>You have to disassemble the terminal first!</span>")
|
||||
return
|
||||
|
||||
playsound(get_turf(src), W.usesound, 50, 1)
|
||||
user << "<span class='warning'>You begin to disassemble the [src]!</span>"
|
||||
to_chat(user, "<span class='warning'>You begin to disassemble the [src]!</span>")
|
||||
if (do_after(usr, (100 * cur_coils) * W.toolspeed)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s with a normal crowbar
|
||||
|
||||
if (failure_probability && prob(failure_probability))
|
||||
total_system_failure(failure_probability, user)
|
||||
return
|
||||
|
||||
usr << "<font color='red'>You have disassembled the SMES cell!</font>"
|
||||
var/obj/structure/frame/M = new /obj/structure/frame(src.loc)
|
||||
M.frame_type = new /datum/frame/frame_types/machine
|
||||
M.anchored = 1
|
||||
var/obj/item/weapon/circuitboard/C = new /obj/item/weapon/circuitboard/smes
|
||||
M.circuit = C
|
||||
M.state = 2
|
||||
M.icon_state = "machine_1"
|
||||
for(var/obj/I in component_parts)
|
||||
I.loc = src.loc
|
||||
component_parts -= I
|
||||
qdel(src)
|
||||
to_chat(user, "<font color='red'>You have disassembled the SMES cell!</font>")
|
||||
dismantle()
|
||||
return
|
||||
|
||||
// Superconducting Magnetic Coil - Upgrade the SMES
|
||||
@@ -367,14 +353,14 @@
|
||||
total_system_failure(failure_probability, user)
|
||||
return
|
||||
|
||||
usr << "You install the coil into the SMES unit!"
|
||||
to_chat(user, "You install the coil into the SMES unit!")
|
||||
user.drop_item()
|
||||
cur_coils ++
|
||||
component_parts += W
|
||||
W.loc = src
|
||||
recalc_coils()
|
||||
else
|
||||
usr << "<font color='red'>You can't insert more coils to this SMES unit!</font>"
|
||||
to_chat(user, "<font color='red'>You can't insert more coils into this SMES unit!</font>")
|
||||
|
||||
// Proc: toggle_input()
|
||||
// Parameters: None
|
||||
|
||||
+102
-58
@@ -18,7 +18,7 @@
|
||||
|
||||
if(propname == "mode_name")
|
||||
name = propvalue
|
||||
if(isnull(propvalue))
|
||||
else if(isnull(propvalue))
|
||||
settings[propname] = gun.vars[propname] //better than initial() as it handles list vars like burst_accuracy
|
||||
else
|
||||
settings[propname] = propvalue
|
||||
@@ -61,13 +61,14 @@
|
||||
var/recoil = 0 //screen shake
|
||||
var/silenced = 0
|
||||
var/muzzle_flash = 3
|
||||
var/accuracy = 0 //accuracy is measured in tiles. +1 accuracy means that everything is effectively one tile closer for the purpose of miss chance, -1 means the opposite. launchers are not supported, at the moment.
|
||||
var/accuracy = 0 //Accuracy is measured in percents. +15 accuracy means that everything is effectively one tile closer for the purpose of miss chance, -15 means the opposite. launchers are not supported, at the moment.
|
||||
var/scoped_accuracy = null
|
||||
var/list/burst_accuracy = list(0) //allows for different accuracies for each shot in a burst. Applied on top of accuracy
|
||||
var/list/dispersion = list(0)
|
||||
var/mode_name = null
|
||||
var/requires_two_hands
|
||||
var/wielded_icon = "gun_wielded"
|
||||
var/projectile_type = /obj/item/projectile //On ballistics, only used to check for the cham gun
|
||||
|
||||
var/wielded_item_state
|
||||
var/one_handed_penalty = 0 // Penalty applied if someone fires a two-handed gun with one hand.
|
||||
var/obj/screen/auto_target/auto_target
|
||||
var/shooting = 0
|
||||
@@ -135,19 +136,32 @@
|
||||
verbs -= /obj/item/weapon/gun/verb/give_dna
|
||||
verbs -= /obj/item/weapon/gun/verb/allow_dna
|
||||
|
||||
/obj/item/weapon/gun/update_held_icon()
|
||||
if(requires_two_hands)
|
||||
/obj/item/weapon/gun/update_twohanding()
|
||||
if(one_handed_penalty)
|
||||
var/mob/living/M = loc
|
||||
if(istype(M))
|
||||
if(M.item_is_in_hands(src) && !M.hands_are_full())
|
||||
if(M.can_wield_item(src) && src.is_held_twohanded(M))
|
||||
name = "[initial(name)] (wielded)"
|
||||
item_state = wielded_icon
|
||||
else
|
||||
name = initial(name)
|
||||
item_state = initial(item_state)
|
||||
update_icon(ignore_inhands=1) // In case item_state is set somewhere else.
|
||||
else
|
||||
name = initial(name)
|
||||
update_icon() // In case item_state is set somewhere else.
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/update_held_icon()
|
||||
if(wielded_item_state)
|
||||
var/mob/living/M = loc
|
||||
if(istype(M))
|
||||
if(M.can_wield_item(src) && src.is_held_twohanded(M))
|
||||
item_state_slots[slot_l_hand_str] = wielded_item_state
|
||||
item_state_slots[slot_r_hand_str] = wielded_item_state
|
||||
else
|
||||
item_state_slots[slot_l_hand_str] = initial(item_state)
|
||||
item_state_slots[slot_r_hand_str] = initial(item_state)
|
||||
..()
|
||||
|
||||
|
||||
//Checks whether a given mob can use the gun
|
||||
//Any checks that shouldn't result in handle_click_empty() being called if they fail should go here.
|
||||
//Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there.
|
||||
@@ -274,6 +288,7 @@
|
||||
verbs -= /obj/item/weapon/gun/verb/allow_dna
|
||||
else
|
||||
user << "<span class='warning'>\The [src] is not accepting modifications at this time.</span>"
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(dna_lock && attached_lock.controller_lock)
|
||||
@@ -317,6 +332,7 @@
|
||||
|
||||
/obj/item/weapon/gun/proc/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0)
|
||||
if(!user || !target) return
|
||||
if(target.z != user.z) return
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -338,12 +354,7 @@
|
||||
|
||||
next_fire_time = world.time + shoot_time
|
||||
|
||||
var/held_acc_mod = 0
|
||||
var/held_disp_mod = 0
|
||||
if(requires_two_hands)
|
||||
if(user.item_is_in_hands(src) && user.hands_are_full())
|
||||
held_acc_mod = held_acc_mod - one_handed_penalty
|
||||
held_disp_mod = held_disp_mod - round(one_handed_penalty / 2)
|
||||
var/held_twohanded = (user.can_wield_item(src) && src.is_held_twohanded(user))
|
||||
|
||||
//actually attempt to shoot
|
||||
var/turf/targloc = get_turf(target) //cache this in case target gets deleted during shooting, e.g. if it was a securitron that got destroyed.
|
||||
@@ -373,9 +384,7 @@
|
||||
handle_click_empty(user)
|
||||
break
|
||||
|
||||
var/acc = burst_accuracy[min(i, burst_accuracy.len)] + held_acc_mod
|
||||
var/disp = dispersion[min(i, dispersion.len)] + held_disp_mod
|
||||
process_accuracy(projectile, user, target, acc, disp)
|
||||
process_accuracy(projectile, user, target, i, held_twohanded)
|
||||
|
||||
if(pointblank)
|
||||
process_point_blank(projectile, user, target)
|
||||
@@ -397,10 +406,9 @@
|
||||
shooting = 0
|
||||
*/
|
||||
// We do this down here, so we don't get the message if we fire an empty gun.
|
||||
if(requires_two_hands)
|
||||
if(user.item_is_in_hands(src) && user.hands_are_full())
|
||||
if(one_handed_penalty >= 2)
|
||||
user << "<span class='warning'>You struggle to keep \the [src] pointed at the correct position with just one hand!</span>"
|
||||
if(user.item_is_in_hands(src) && user.hands_are_full())
|
||||
if(one_handed_penalty >= 20)
|
||||
to_chat(user, "<span class='warning'>You struggle to keep \the [src] pointed at the correct position with just one hand!</span>")
|
||||
|
||||
if(reflex)
|
||||
admin_attack_log(user, target, attacker_message = "fired [src] by reflex.", victim_message = "triggered a reflex shot from [src].", admin_message = "shot [target], who triggered gunfire ([src]) by reflex)")
|
||||
@@ -519,25 +527,45 @@
|
||||
//called after successfully firing
|
||||
/obj/item/weapon/gun/proc/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0)
|
||||
if(silenced)
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
to_chat(user, "<span class='warning'>You fire \the [src][pointblank ? " point blank at \the [target]":""][reflex ? " by reflex!":""]</span>")
|
||||
for(var/mob/living/L in oview(2,user))
|
||||
if(L.stat)
|
||||
continue
|
||||
if(L.blinded)
|
||||
to_chat(L, "You hear a [fire_sound_text]!")
|
||||
continue
|
||||
to_chat(L, "<span class='warning'>[user] fires \the [src][pointblank ? " point blank at \the [target]":""][reflex ? " by reflex!":""]</span>")
|
||||
else
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user] fires \the [src][pointblank ? " point blank at \the [target]":""][reflex ? " by reflex!":""]</span>",
|
||||
"<span class='warning'>You fire \the [src][pointblank ? " point blank at \the [target]":""][reflex ? " by reflex!":""]</span>",
|
||||
"You hear a [fire_sound_text]!"
|
||||
)
|
||||
if(reflex)
|
||||
user.visible_message(
|
||||
"<span class='reflex_shoot'><b>\The [user] fires \the [src][pointblank ? " point blank at \the [target]":""] by reflex!</b></span>",
|
||||
"<span class='reflex_shoot'>You fire \the [src] by reflex!</span>",
|
||||
"You hear a [fire_sound_text]!"
|
||||
)
|
||||
else
|
||||
user.visible_message(
|
||||
"<span class='danger'>\The [user] fires \the [src][pointblank ? " point blank at \the [target]":""]!</span>",
|
||||
"<span class='warning'>You fire \the [src]!</span>",
|
||||
"You hear a [fire_sound_text]!"
|
||||
)
|
||||
|
||||
if(muzzle_flash)
|
||||
set_light(muzzle_flash)
|
||||
if(muzzle_flash)
|
||||
set_light(muzzle_flash)
|
||||
|
||||
if(one_handed_penalty)
|
||||
if(!src.is_held_twohanded(user))
|
||||
switch(one_handed_penalty)
|
||||
if(1 to 15)
|
||||
if(prob(50)) //don't need to tell them every single time
|
||||
to_chat(user, "<span class='warning'>Your aim wavers slightly.</span>")
|
||||
if(16 to 30)
|
||||
to_chat(user, "<span class='warning'>Your aim wavers as you fire \the [src] with just one hand.</span>")
|
||||
if(31 to 45)
|
||||
to_chat(user, "<span class='warning'>You have trouble keeping \the [src] on target with just one hand.</span>")
|
||||
if(46 to INFINITY)
|
||||
to_chat(user, "<span class='warning'>You struggle to keep \the [src] on target with just one hand!</span>")
|
||||
else if(!user.can_wield_item(src))
|
||||
switch(one_handed_penalty)
|
||||
if(1 to 15)
|
||||
if(prob(50)) //don't need to tell them every single time
|
||||
to_chat(user, "<span class='warning'>Your aim wavers slightly.</span>")
|
||||
if(16 to 30)
|
||||
to_chat(user, "<span class='warning'>Your aim wavers as you try to hold \the [src] steady.</span>")
|
||||
if(31 to 45)
|
||||
to_chat(user, "<span class='warning'>You have trouble holding \the [src] steady.</span>")
|
||||
if(46 to INFINITY)
|
||||
to_chat(user, "<span class='warning'>You struggle to hold \the [src] steady!</span>")
|
||||
|
||||
if(recoil)
|
||||
spawn()
|
||||
@@ -566,29 +594,37 @@
|
||||
damage_mult = 1.5
|
||||
P.damage *= damage_mult
|
||||
|
||||
/obj/item/weapon/gun/proc/process_accuracy(obj/projectile, mob/living/user, atom/target, acc_mod, dispersion)
|
||||
/obj/item/weapon/gun/proc/process_accuracy(obj/projectile, mob/living/user, atom/target, var/burst, var/held_twohanded)
|
||||
var/obj/item/projectile/P = projectile
|
||||
if(!istype(P))
|
||||
return //default behaviour only applies to true projectiles
|
||||
|
||||
var/acc_mod = burst_accuracy[min(burst, burst_accuracy.len)]
|
||||
var/disp_mod = dispersion[min(burst, dispersion.len)]
|
||||
|
||||
if(one_handed_penalty)
|
||||
if(!held_twohanded)
|
||||
acc_mod += -ceil(one_handed_penalty/2)
|
||||
disp_mod += one_handed_penalty*0.5 //dispersion per point of two-handedness
|
||||
|
||||
//Accuracy modifiers
|
||||
P.accuracy = accuracy + acc_mod
|
||||
P.dispersion = dispersion
|
||||
P.dispersion = disp_mod
|
||||
|
||||
// Certain statuses make it harder to aim, blindness especially. Same chances as melee, however guns accuracy uses multiples of 15.
|
||||
if(user.eye_blind)
|
||||
P.accuracy -= 5
|
||||
P.accuracy -= 75
|
||||
if(user.eye_blurry)
|
||||
P.accuracy -= 2
|
||||
P.accuracy -= 30
|
||||
if(user.confused)
|
||||
P.accuracy -= 3
|
||||
P.accuracy -= 45
|
||||
|
||||
//accuracy bonus from aiming
|
||||
if (aim_targets && (target in aim_targets))
|
||||
//If you aim at someone beforehead, it'll hit more often.
|
||||
//Kinda balanced by fact you need like 2 seconds to aim
|
||||
//As opposed to no-delay pew pew
|
||||
P.accuracy += 2
|
||||
P.accuracy += 30
|
||||
|
||||
// Some modifiers make it harder or easier to hit things.
|
||||
for(var/datum/modifier/M in user.modifiers)
|
||||
@@ -618,17 +654,24 @@
|
||||
y_offset = rand(-1,1)
|
||||
x_offset = rand(-1,1)
|
||||
|
||||
return !P.launch_from_gun(target, user, src, target_zone, x_offset, y_offset)
|
||||
var/launched = !P.launch_from_gun(target, user, src, target_zone, x_offset, y_offset)
|
||||
|
||||
//apart of reskins that have two sprites, touching may result in frustration and breaks
|
||||
/obj/item/weapon/gun/projectile/colt/detective/attack_hand(var/mob/living/user)
|
||||
if(!unique_reskin && loc == user)
|
||||
reskin_gun(user)
|
||||
return
|
||||
..()
|
||||
if(launched)
|
||||
play_fire_sound(user, P)
|
||||
|
||||
return launched
|
||||
|
||||
|
||||
/obj/item/weapon/gun/proc/play_fire_sound(var/mob/user, var/obj/item/projectile/P)
|
||||
var/shot_sound = (istype(P) && P.fire_sound)? P.fire_sound : fire_sound
|
||||
if(silenced)
|
||||
playsound(user, shot_sound, 10, 1)
|
||||
else
|
||||
playsound(user, shot_sound, 50, 1)
|
||||
|
||||
//Suicide handling.
|
||||
/obj/item/weapon/gun/var/mouthshoot = 0 //To stop people from suiciding twice... >.>
|
||||
|
||||
/obj/item/weapon/gun/proc/handle_suicide(mob/living/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
@@ -643,10 +686,11 @@
|
||||
var/obj/item/projectile/in_chamber = consume_next_projectile()
|
||||
if (istype(in_chamber))
|
||||
user.visible_message("<span class = 'warning'>[user] pulls the trigger.</span>")
|
||||
var/shot_sound = in_chamber.fire_sound? in_chamber.fire_sound : fire_sound
|
||||
if(silenced)
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
playsound(user, shot_sound, 10, 1)
|
||||
else
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
playsound(user, shot_sound, 50, 1)
|
||||
if(istype(in_chamber, /obj/item/projectile/beam/lastertag))
|
||||
user.show_message("<span class = 'warning'>You feel rather silly, trying to commit suicide with a toy.</span>")
|
||||
mouthshoot = 0
|
||||
@@ -692,7 +736,7 @@
|
||||
..()
|
||||
if(firemodes.len > 1)
|
||||
var/datum/firemode/current_mode = firemodes[sel_mode]
|
||||
user << "The fire selector is set to [current_mode.name]."
|
||||
to_chat(user, "The fire selector is set to [current_mode.name].")
|
||||
|
||||
/obj/item/weapon/gun/proc/switch_firemodes(mob/user)
|
||||
if(firemodes.len <= 1)
|
||||
@@ -703,7 +747,7 @@
|
||||
sel_mode = 1
|
||||
var/datum/firemode/new_mode = firemodes[sel_mode]
|
||||
new_mode.apply_to(src)
|
||||
user << "<span class='notice'>\The [src] is now set to [mode_name].</span>"
|
||||
to_chat(user, "<span class='notice'>\The [src] is now set to [new_mode.name].</span>")
|
||||
|
||||
return new_mode
|
||||
|
||||
|
||||
@@ -7,8 +7,10 @@
|
||||
|
||||
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
|
||||
var/charge_cost = 240 //How much energy is needed to fire.
|
||||
|
||||
var/cell_type = /obj/item/weapon/cell/device/weapon
|
||||
var/projectile_type = /obj/item/projectile/beam/practice
|
||||
projectile_type = /obj/item/projectile/beam/practice
|
||||
|
||||
var/modifystate
|
||||
var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
switch between standard fire and a more efficent but weaker 'suppressive' fire."
|
||||
icon_state = "laser"
|
||||
item_state = "laser"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
wielded_item_state = "laser-wielded"
|
||||
fire_delay = 8
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
w_class = ITEMSIZE_LARGE
|
||||
@@ -12,8 +12,7 @@
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
projectile_type = /obj/item/projectile/beam/midlaser
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 2
|
||||
// one_handed_penalty = 30
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240),
|
||||
@@ -23,7 +22,7 @@
|
||||
/obj/item/weapon/gun/energy/laser/mounted
|
||||
self_recharge = 1
|
||||
use_external_power = 1
|
||||
requires_two_hands = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
|
||||
one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/practice
|
||||
name = "practice laser carbine"
|
||||
@@ -43,7 +42,6 @@
|
||||
icon_state = "retro"
|
||||
item_state = "retro"
|
||||
desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
@@ -79,7 +77,6 @@
|
||||
item_state = "caplaser"
|
||||
desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well."
|
||||
force = 5
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
@@ -95,15 +92,13 @@
|
||||
flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!"
|
||||
icon_state = "lasercannon"
|
||||
item_state = null
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
projectile_type = /obj/item/projectile/beam/heavylaser/cannon
|
||||
battery_lock = 1
|
||||
fire_delay = 20
|
||||
w_class = ITEMSIZE_LARGE
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 6 // The thing's heavy and huge.
|
||||
// one_handed_penalty = 90 // The thing's heavy and huge.
|
||||
accuracy = 3
|
||||
charge_cost = 600
|
||||
|
||||
@@ -113,7 +108,7 @@
|
||||
use_external_power = 1
|
||||
recharge_time = 10
|
||||
accuracy = 0 // Mounted cannons are just fine the way they are.
|
||||
requires_two_hands = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
|
||||
one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
|
||||
projectile_type = /obj/item/projectile/beam/heavylaser
|
||||
charge_cost = 400
|
||||
fire_delay = 20
|
||||
@@ -124,7 +119,6 @@
|
||||
standard photonic beams, resulting in an effective 'anti-armor' energy weapon."
|
||||
icon_state = "xray"
|
||||
item_state = "xray"
|
||||
fire_sound = 'sound/weapons/eluger.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2)
|
||||
projectile_type = /obj/item/projectile/beam/xray
|
||||
charge_cost = 200
|
||||
@@ -145,10 +139,10 @@
|
||||
fire_delay = 35
|
||||
force = 10
|
||||
w_class = ITEMSIZE_HUGE // So it can't fit in a backpack.
|
||||
accuracy = -3 //shooting at the hip
|
||||
accuracy = -45 //shooting at the hip
|
||||
scoped_accuracy = 0
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 4 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
|
||||
// one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
|
||||
|
||||
/obj/item/weapon/gun/energy/sniperrifle/verb/scope()
|
||||
set category = "Object"
|
||||
@@ -165,7 +159,6 @@
|
||||
desc = "Standard issue weapon of the Imperial Guard"
|
||||
origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
projectile_type = /obj/item/projectile/beam/lastertag/blue
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge
|
||||
battery_lock = 1
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "Another bestseller of Lawson Arms and the FTU, the LAEP90 Perun is a versatile energy based sidearm, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
|
||||
icon_state = "energystun100"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
fire_delay = 10 // Handguns should be inferior to two-handed weapons.
|
||||
|
||||
projectile_type = /obj/item/projectile/beam/stun/med
|
||||
@@ -11,8 +10,8 @@
|
||||
modifystate = "energystun"
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="energystun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="energystun", charge_cost = 240),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", charge_cost = 480),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/mounted
|
||||
@@ -26,7 +25,6 @@
|
||||
desc = "The FM-2t is a versatile energy based weapon, capable of switching between stun or kill with a three round burst option for both settings."
|
||||
icon_state = "fm-2tstun100" //May resprite this to be more rifley
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
charge_cost = 100
|
||||
force = 8
|
||||
w_class = ITEMSIZE_LARGE //Probably gonna make it a rifle sooner or later
|
||||
@@ -37,13 +35,13 @@
|
||||
modifystate = "fm-2tstun"
|
||||
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 2
|
||||
// one_handed_penalty = 30
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 100),
|
||||
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'),
|
||||
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 200),
|
||||
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'),
|
||||
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", charge_cost = 100),
|
||||
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun"),
|
||||
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", charge_cost = 200),
|
||||
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill"),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/nuclear
|
||||
@@ -61,9 +59,9 @@
|
||||
modifystate = null
|
||||
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 1 // It's rather bulky, so holding it in one hand is a little harder than with two, however it's not 'required'.
|
||||
// one_handed_penalty = 15 // It's rather bulky, so holding it in one hand is a little harder than with two, however it's not 'required'.
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="nucgunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="nucgunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="nucgunstun", charge_cost = 240),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="nucgunkill", charge_cost = 480),
|
||||
)
|
||||
@@ -5,15 +5,14 @@
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
force = 10
|
||||
fire_sound='sound/weapons/Laser.ogg'
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
charge_cost = 120
|
||||
sel_mode = 2
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost = 120),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost = 120),
|
||||
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost = 240),
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_delay=null, charge_cost = 120),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_delay=null, charge_cost = 120),
|
||||
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_delay=null, charge_cost = 240),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/pulse_rifle/mounted
|
||||
@@ -39,7 +38,7 @@
|
||||
charge_cost = 240
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost = 240),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost = 240),
|
||||
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost = 480),
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_delay=null, charge_cost = 240),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_delay=null, charge_cost = 240),
|
||||
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_delay=null, charge_cost = 480),
|
||||
)
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "The NT Mk60 EW Halicon is a man portable anti-armor weapon designed to disable mechanical threats, produced by NT. Not the best of its type."
|
||||
icon_state = "ionrifle"
|
||||
item_state = "ionrifle"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4)
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 10
|
||||
@@ -23,7 +22,7 @@
|
||||
force = 5
|
||||
slot_flags = SLOT_BELT|SLOT_HOLSTER
|
||||
charge_cost = 480
|
||||
projectile_type = /obj/item/projectile/ion
|
||||
projectile_type = /obj/item/projectile/ion/pistol
|
||||
|
||||
/obj/item/weapon/gun/energy/phasegun
|
||||
name = "phase pistol"
|
||||
@@ -202,12 +201,12 @@ obj/item/weapon/gun/energy/staff/focus
|
||||
projectile_type = /obj/item/projectile/energy/blue_pellet
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge
|
||||
battery_lock = 1
|
||||
accuracy = 5 // Suppressive weapons don't work too well if there's no risk of being hit.
|
||||
accuracy = 75 // Suppressive weapons don't work too well if there's no risk of being hit.
|
||||
burst_delay = 1 // Burst faster than average.
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 6, TECH_ILLEGAL = 6)
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="single shot", burst = 1, burst_accuracy = list(5), dispersion = list(0), charge_cost = 24),
|
||||
list(mode_name="five shot burst", burst = 5, burst_accuracy = list(5,5,5,5,5), dispersion = list(1,1,1,1,1)),
|
||||
list(mode_name="ten shot burst", burst = 10, burst_accuracy = list(5,5,5,5,5,5,5,5,5,5), dispersion = list(2,2,2,2,2,2,2,2,2,2))
|
||||
list(mode_name="single shot", burst = 1, burst_accuracy = list(75), dispersion = list(0), charge_cost = 24),
|
||||
list(mode_name="five shot burst", burst = 5, burst_accuracy = list(75,75,75,75,75), dispersion = list(1,1,1,1,1)),
|
||||
list(mode_name="ten shot burst", burst = 10, burst_accuracy = list(75,75,75,75,75,75,75,75,75,75), dispersion = list(2,2,2,2,2,2,2,2,2,2)),
|
||||
)
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "The NT Mk30 NL is a small gun used for non-lethal takedowns. Produced by NT, it's actually a licensed version of a W-T design."
|
||||
icon_state = "taser"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
projectile_type = /obj/item/projectile/beam/stun
|
||||
|
||||
/obj/item/weapon/gun/energy/taser/mounted
|
||||
@@ -22,7 +21,6 @@
|
||||
desc = "A LAEP20 Zeus. Designed by Lawson Arms and produced under the wing of Hephaestus, several TSCs have been trying to get a hold of the blueprints for half a decade."
|
||||
icon_state = "stunrevolver"
|
||||
item_state = "stunrevolver"
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
|
||||
projectile_type = /obj/item/projectile/energy/electrode/strong
|
||||
charge_cost = 300
|
||||
@@ -63,7 +61,6 @@
|
||||
desc = "The Mars Military Industries MA21 Selkie is a weapon that uses a laser pulse to ionise the local atmosphere, creating a disorienting pulse of plasma and deafening shockwave as the wave expands."
|
||||
icon_state = "plasma_stun"
|
||||
item_state = "plasma_stun"
|
||||
fire_sound = 'sound/weapons/blaster.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_POWER = 3)
|
||||
fire_delay = 20
|
||||
charge_cost = 600
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "coilgun"
|
||||
item_state = "coilgun"
|
||||
icon = 'icons/obj/railgun.dmi'
|
||||
// one_handed_penalty = 1
|
||||
// one_handed_penalty = 15
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_MAGNET = 4)
|
||||
w_class = ITEMSIZE_LARGE
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
var/obj/item/loaded // Currently loaded object, for retrieval/unloading.
|
||||
var/load_type = /obj/item/stack/rods // Type of stack to load with.
|
||||
var/projectile_type = /obj/item/projectile/bullet/magnetic // Actual fire type, since this isn't throw_at rod launcher.
|
||||
projectile_type = /obj/item/projectile/bullet/magnetic // Actual fire type, since this isn't throw_at rod launcher.
|
||||
|
||||
var/power_cost = 950 // Cost per fire, should consume almost an entire basic cell.
|
||||
var/power_per_tick // Capacitor charge per process(). Updated based on capacitor rating.
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
w_class = ITEMSIZE_HUGE
|
||||
slot_flags = SLOT_BELT
|
||||
loaded = /obj/item/weapon/rcd_ammo/large
|
||||
slowdown = 1 // Slowdown equals slowdown_worn, until we decide to import the system to differentiate between held and worn items
|
||||
fire_delay = 1
|
||||
|
||||
var/initial_cell_type = /obj/item/weapon/cell/hyper
|
||||
var/initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv
|
||||
@@ -59,7 +61,9 @@
|
||||
|
||||
initial_cell_type = /obj/item/weapon/cell/infinite
|
||||
initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/super
|
||||
fire_delay = 0
|
||||
|
||||
slowdown = 2
|
||||
slowdown_held = 3
|
||||
slowdown_worn = 2
|
||||
|
||||
@@ -67,9 +71,9 @@
|
||||
w_class = ITEMSIZE_NO_CONTAINER
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_handed_penalty=1, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
|
||||
list(mode_name="long bursts", burst=6, fire_delay=null, move_delay=10, one_handed_penalty=2, burst_accuracy=list(0,-1,-1,-1,-2), dispersion=list(0.6, 0.6, 1.0, 1.0, 1.2)),
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_handed_penalty=15, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=30, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)),
|
||||
list(mode_name="long bursts", burst=6, fire_delay=null, move_delay=10, one_handed_penalty=30, burst_accuracy=list(0,-15,-15,-15,-30), dispersion=list(0.6, 0.6, 1.0, 1.0, 1.2)),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/magnetic/railgun/automatic/examine(var/mob/user)
|
||||
@@ -82,11 +86,18 @@
|
||||
desc = "The MI-12 Skadi is a burst fire capable railgun that fires flechette rounds at high velocity. Deadly against armour, but much less effective against soft targets."
|
||||
icon_state = "flechette_gun"
|
||||
item_state = "z8carbine"
|
||||
|
||||
initial_cell_type = /obj/item/weapon/cell/hyper
|
||||
initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv
|
||||
|
||||
fire_delay = 0
|
||||
|
||||
slot_flags = SLOT_BACK
|
||||
|
||||
slowdown = 0
|
||||
slowdown_held = 0
|
||||
slowdown_worn = 0
|
||||
|
||||
power_cost = 100
|
||||
load_type = /obj/item/weapon/magnetic_ammo
|
||||
projectile_type = /obj/item/projectile/bullet/magnetic/flechette
|
||||
@@ -95,6 +106,6 @@
|
||||
empty_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_handed_penalty=1, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_handed_penalty=15, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=30, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)),
|
||||
)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1000)
|
||||
recoil = 1
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/strong //Only used for Cham Guns
|
||||
|
||||
var/caliber = ".357" //determines which casings will fit
|
||||
var/handle_casings = EJECT_CASINGS //determines how spent casings should be handled
|
||||
|
||||
@@ -9,16 +9,16 @@
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
|
||||
slot_flags = SLOT_BELT
|
||||
ammo_type = /obj/item/ammo_casing/a9mm
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
multi_aim = 1
|
||||
burst_delay = 2
|
||||
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 1
|
||||
// one_handed_penalty = 15
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0))
|
||||
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1,-2,-2), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0))
|
||||
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15,-30,-30), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r
|
||||
@@ -35,11 +35,11 @@
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m10mm
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m10mm)
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
||||
auto_eject = 1
|
||||
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 2
|
||||
// one_handed_penalty = 15
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r/update_icon()
|
||||
..()
|
||||
@@ -62,13 +62,14 @@
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m545
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m545)
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/a545
|
||||
|
||||
one_handed_penalty = 4
|
||||
// one_handed_penalty = 30
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-1,-2), dispersion=list(0.0, 0.6, 0.6))
|
||||
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=6, burst_accuracy=list(0,-1,-2,-2,-3), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15,-30), dispersion=list(0.0, 0.6, 0.6))
|
||||
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15,-30,-30,-45), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/sts35/update_icon(var/ignore_inhands)
|
||||
@@ -93,6 +94,7 @@
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m9mmt/rubber
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mmt)
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/wt550/update_icon()
|
||||
..()
|
||||
@@ -116,15 +118,16 @@
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m762
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m762)
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/a762
|
||||
auto_eject = 1
|
||||
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
|
||||
one_handed_penalty = 4
|
||||
// one_handed_penalty = 60
|
||||
|
||||
burst_delay = 4
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, use_launcher=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="2-round bursts", burst=2, fire_delay=null, move_delay=6, use_launcher=null, burst_accuracy=list(0,-1), dispersion=list(0.0, 0.6)),
|
||||
list(mode_name="2-round bursts", burst=2, fire_delay=null, move_delay=6, use_launcher=null, burst_accuracy=list(0,-15), dispersion=list(0.0, 0.6)),
|
||||
list(mode_name="fire grenades", burst=null, fire_delay=null, move_delay=null, use_launcher=1, burst_accuracy=null, dispersion=null)
|
||||
)
|
||||
|
||||
@@ -187,8 +190,9 @@
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m545saw
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m545saw, /obj/item/ammo_magazine/m545)
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/a545
|
||||
|
||||
one_handed_penalty = 6
|
||||
// one_handed_penalty = 90
|
||||
|
||||
var/cover_open = 0
|
||||
|
||||
@@ -203,8 +207,8 @@
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
|
||||
list(mode_name="short bursts", burst=5, move_delay=6, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)),
|
||||
list(mode_name="short bursts", burst=5, move_delay=6, burst_accuracy = list(0,-15,-15,-30,-30), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2))
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/l6_saw/special_check(mob/user)
|
||||
@@ -260,19 +264,19 @@
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 10
|
||||
caliber = "12g"
|
||||
fire_sound = 'sound/weapons/shotgun.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4)
|
||||
slot_flags = SLOT_BACK
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m12gdrum
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m12gdrum)
|
||||
projectile_type = /obj/item/projectile/bullet/shotgun
|
||||
|
||||
one_handed_penalty = 4
|
||||
// one_handed_penalty = 60
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0),
|
||||
list(mode_name="3-round bursts", burst=3, move_delay=6, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.0, 0.6, 0.6))
|
||||
// list(mode_name="6-round bursts", burst=6, move_delay=6, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2, 1.2)),
|
||||
list(mode_name="3-round bursts", burst=3, move_delay=6, burst_accuracy = list(0,-15,-15,-30,-30), dispersion = list(0.0, 0.6, 0.6))
|
||||
// list(mode_name="6-round bursts", burst=6, move_delay=6, burst_accuracy = list(0,-15,-15,-30,-30, -30), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2, 1.2)),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/as24/update_icon()
|
||||
@@ -296,7 +300,7 @@
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0),
|
||||
list(mode_name="3-round bursts", burst=3, burst_delay=1, fire_delay=4, move_delay=4, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0))
|
||||
list(mode_name="3-round bursts", burst=3, burst_delay=1, fire_delay=4, move_delay=4, burst_accuracy = list(0,-15,-15,-30,-30), dispersion = list(0.6, 1.0, 1.0))
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/mini_uzi/update_icon()
|
||||
@@ -322,7 +326,7 @@
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0))
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0))
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/p90/update_icon()
|
||||
@@ -342,7 +346,7 @@
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0))
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0))
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/tommygun/update_icon()
|
||||
@@ -363,12 +367,13 @@
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m762
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m762, /obj/item/ammo_magazine/m762m)
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/a762
|
||||
|
||||
one_handed_penalty = 4
|
||||
// one_handed_penalty = 45
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="2-round bursts", burst=2, fire_delay=null, move_delay=6, burst_accuracy=list(0,-1), dispersion=list(0.0, 0.6))
|
||||
list(mode_name="2-round bursts", burst=2, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15), dispersion=list(0.0, 0.6))
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/bullpup/update_icon(var/ignore_inhands)
|
||||
@@ -379,4 +384,5 @@
|
||||
icon_state = "bullpup"
|
||||
else
|
||||
item_state = "bullpup-empty"
|
||||
if(!ignore_inhands) update_held_icon()
|
||||
if(!ignore_inhands)
|
||||
update_held_icon()
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
icon_state = "sawnrifle"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
recoil = 2 // Owch
|
||||
accuracy = -1 // You know damn well why.
|
||||
accuracy = -15 // You know damn well why.
|
||||
item_state = "gun"
|
||||
slot_flags &= ~SLOT_BACK //you can't sling it on your back
|
||||
slot_flags |= (SLOT_BELT|SLOT_HOLSTER) //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) - or in a holster, why not.
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
handle_casings = HOLD_CASINGS
|
||||
max_shells = 1
|
||||
ammo_type = /obj/item/ammo_casing/a357
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/strong
|
||||
var/retracted_bolt = 0
|
||||
load_method = SINGLE_CASING
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
|
||||
magazine_type = /obj/item/ammo_magazine/m45
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m45)
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
||||
icon_state = "colt"
|
||||
caliber = ".45"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
load_method = MAGAZINE
|
||||
|
||||
/obj/item/weapon/gun/projectile/colt/update_icon()
|
||||
@@ -68,14 +68,22 @@
|
||||
M << "Your gun is now sprited as [choice]. Say hello to your new friend."
|
||||
return 1
|
||||
|
||||
/*//apart of reskins that have two sprites, touching may result in frustration and breaks
|
||||
/obj/item/weapon/gun/projectile/colt/detective/attack_hand(var/mob/living/user)
|
||||
if(!unique_reskin && loc == user)
|
||||
reskin_gun(user)
|
||||
return
|
||||
..()
|
||||
*/
|
||||
|
||||
/obj/item/weapon/gun/projectile/sec
|
||||
name = ".45 pistol"
|
||||
desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds."
|
||||
icon_state = "secguncomp"
|
||||
magazine_type = /obj/item/ammo_magazine/m45/rubber
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
||||
caliber = ".45"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
load_method = MAGAZINE
|
||||
|
||||
/obj/item/weapon/gun/projectile/sec/update_icon()
|
||||
@@ -114,6 +122,7 @@
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m45
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m45)
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
||||
|
||||
/obj/item/weapon/gun/projectile/deagle
|
||||
name = "desert eagle"
|
||||
@@ -195,10 +204,10 @@
|
||||
caliber = "9mm"
|
||||
silenced = 0
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2)
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m9mm/compact
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mm/compact)
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
|
||||
/obj/item/weapon/gun/projectile/pistol/flash
|
||||
name = "compact signal pistol"
|
||||
@@ -291,6 +300,7 @@
|
||||
load_method = SINGLE_CASING
|
||||
max_shells = 2
|
||||
ammo_type = /obj/item/ammo_casing/a357
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/strong
|
||||
|
||||
/obj/item/weapon/gun/projectile/luger
|
||||
name = "\improper P08 Luger"
|
||||
@@ -299,9 +309,9 @@
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
|
||||
caliber = "9mm"
|
||||
load_method = MAGAZINE
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
magazine_type = /obj/item/ammo_magazine/m9mm/compact
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mm/compact)
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
|
||||
/obj/item/weapon/gun/projectile/luger/update_icon()
|
||||
..()
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
handle_casings = CYCLE_CASINGS
|
||||
max_shells = 6
|
||||
ammo_type = /obj/item/ammo_casing/a357
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/strong
|
||||
var/chamber_offset = 0 //how many empty chambers in the cylinder until you hit a round
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/verb/spin_cylinder()
|
||||
@@ -154,6 +155,7 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
|
||||
handle_casings = CYCLE_CASINGS
|
||||
max_shells = 7
|
||||
ammo_type = /obj/item/ammo_casing/cap
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/strong
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/judge
|
||||
name = "\"The Judge\""
|
||||
@@ -162,10 +164,10 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
|
||||
caliber = "12g"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 4)
|
||||
max_shells = 5
|
||||
fire_sound = 'sound/weapons/shotgun.ogg'
|
||||
recoil = 2 // ow my fucking hand
|
||||
accuracy = -1 // smooth bore + short barrel = shit accuracy
|
||||
accuracy = -15 // smooth bore + short barrel = shit accuracy
|
||||
ammo_type = /obj/item/ammo_casing/a12g
|
||||
projectile_type = /obj/item/projectile/bullet/shotgun
|
||||
// ToDo: Remove accuracy debuf in exchange for slightly injuring your hand every time you fire it.
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/lemat
|
||||
@@ -176,9 +178,9 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
handle_casings = CYCLE_CASINGS
|
||||
max_shells = 9
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
caliber = ".38"
|
||||
ammo_type = /obj/item/ammo_casing/a38
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
var/secondary_max_shells = 1
|
||||
var/secondary_caliber = "12g"
|
||||
var/secondary_ammo_type = /obj/item/ammo_casing/a12g
|
||||
@@ -208,7 +210,6 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
|
||||
|
||||
if(caliber && secondary_caliber)
|
||||
caliber = secondary_caliber
|
||||
fire_sound = 'sound/weapons/shotgun.ogg'
|
||||
|
||||
if(ammo_type && secondary_ammo_type)
|
||||
ammo_type = secondary_ammo_type
|
||||
@@ -225,7 +226,6 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
|
||||
|
||||
if(caliber && secondary_caliber)
|
||||
caliber = initial(caliber)
|
||||
fire_sound = initial(fire_sound)
|
||||
|
||||
if(ammo_type && secondary_ammo_type)
|
||||
ammo_type = initial(ammo_type)
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
|
||||
load_method = SINGLE_CASING|SPEEDLOADER
|
||||
ammo_type = /obj/item/ammo_casing/a12g/beanbag
|
||||
projectile_type = /obj/item/projectile/bullet/shotgun
|
||||
handle_casings = HOLD_CASINGS
|
||||
fire_sound = 'sound/weapons/shotgun.ogg'
|
||||
var/recentpump = 0 // to prevent spammage
|
||||
var/action_sound = 'sound/weapons/shotgunpump.ogg'
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
slot_flags |= (SLOT_BELT|SLOT_HOLSTER) //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) - or in a holster, why not.
|
||||
name = "sawn-off shotgun"
|
||||
desc = "Omar's coming!"
|
||||
user << "<span class='warning'>You shorten the barrel of \the [src]!</span>"
|
||||
to_chat(user, "<span class='warning'>You shorten the barrel of \the [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -11,13 +11,14 @@
|
||||
origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
|
||||
caliber = "14.5mm"
|
||||
recoil = 5 //extra kickback
|
||||
fire_sound = 'sound/weapons/sniper.ogg' // extra boom
|
||||
handle_casings = HOLD_CASINGS
|
||||
load_method = SINGLE_CASING
|
||||
max_shells = 1
|
||||
ammo_type = /obj/item/ammo_casing/a145
|
||||
accuracy = -5
|
||||
scoped_accuracy = 5
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/a145
|
||||
accuracy = -75
|
||||
scoped_accuracy = 75
|
||||
// one_handed_penalty = 90
|
||||
var/bolt_open = 0
|
||||
|
||||
/obj/item/weapon/gun/projectile/heavysniper/update_icon()
|
||||
@@ -79,10 +80,10 @@
|
||||
origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
|
||||
caliber = "7.62mm"
|
||||
load_method = MAGAZINE
|
||||
accuracy = -3 //shooting at the hip
|
||||
accuracy = -45 //shooting at the hip
|
||||
scoped_accuracy = 0
|
||||
// requires_two_hands = 1
|
||||
one_handed_penalty = 4 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
|
||||
// one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
|
||||
fire_sound = 'sound/weapons/SVD_shot.ogg'
|
||||
magazine_type = /obj/item/ammo_magazine/m762svd
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m762svd)
|
||||
|
||||
@@ -56,23 +56,23 @@
|
||||
desc = "A vicious alien beam weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive."
|
||||
icon_state = "darkcannon"
|
||||
item_state = "darkcannon"
|
||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||
w_class = ITEMSIZE_HUGE
|
||||
charge_cost = 300
|
||||
projectile_type = /obj/item/projectile/beam/stun/darkmatter
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge
|
||||
battery_lock = 1
|
||||
accuracy = 2
|
||||
accuracy = 30
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="stunning", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/stun/darkmatter, charge_cost = 300),
|
||||
list(mode_name="focused", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/darkmatter, charge_cost = 600),
|
||||
list(mode_name="stunning", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(30), dispersion=null, projectile_type=/obj/item/projectile/beam/stun/darkmatter, charge_cost = 300),
|
||||
list(mode_name="focused", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(30), dispersion=null, projectile_type=/obj/item/projectile/beam/darkmatter, charge_cost = 600),
|
||||
list(mode_name="scatter burst", burst=8, fire_delay=null, move_delay=4, burst_accuracy=list(0, 0, 0, 0, 0, 0, 0, 0), dispersion=list(3, 3, 3, 3, 3, 3, 3, 3, 3), projectile_type=/obj/item/projectile/energy/darkmatter, charge_cost = 300),
|
||||
)
|
||||
|
||||
/obj/item/projectile/beam/stun/darkmatter
|
||||
name = "dark matter wave"
|
||||
icon_state = "darkt"
|
||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||
nodamage = 1
|
||||
taser_effect = 1
|
||||
agony = 55
|
||||
@@ -86,6 +86,7 @@
|
||||
/obj/item/projectile/beam/darkmatter
|
||||
name = "dark matter bolt"
|
||||
icon_state = "darkb"
|
||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||
damage = 35
|
||||
armor_penetration = 35
|
||||
damage_type = BRUTE
|
||||
@@ -101,6 +102,7 @@
|
||||
/obj/item/projectile/energy/darkmatter
|
||||
name = "dark matter pellet"
|
||||
icon_state = "dark_pellet"
|
||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||
damage = 20
|
||||
armor_penetration = 35
|
||||
damage_type = BRUTE
|
||||
@@ -117,7 +119,6 @@
|
||||
desc = "A vicious alien sound weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive."
|
||||
icon_state = "noise"
|
||||
item_state = "noise"
|
||||
fire_sound = 'sound/effects/basscannon.ogg'
|
||||
w_class = ITEMSIZE_HUGE
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge
|
||||
battery_lock = 1
|
||||
@@ -133,6 +134,7 @@
|
||||
/obj/item/projectile/sonic
|
||||
name = "sonic pulse"
|
||||
icon_state = "sound"
|
||||
fire_sound = 'sound/effects/basscannon.ogg'
|
||||
damage = 5
|
||||
armor_penetration = 30
|
||||
damage_type = BRUTE
|
||||
|
||||
@@ -69,6 +69,8 @@
|
||||
var/tracer_type
|
||||
var/impact_type
|
||||
|
||||
var/fire_sound
|
||||
|
||||
var/vacuum_traversal = 1 //Determines if the projectile can exist in vacuum, if false, the projectile will be deleted if it enters vacuum.
|
||||
|
||||
var/datum/plot_vector/trajectory // used to plot the path of the projectile
|
||||
@@ -177,7 +179,7 @@
|
||||
return
|
||||
|
||||
//roll to-hit
|
||||
miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier + round(15*target_mob.get_evasion()), 0)
|
||||
miss_modifier = max(15*(distance-2) - accuracy + miss_modifier + target_mob.get_evasion(), 0)
|
||||
var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss
|
||||
|
||||
var/result = PROJECTILE_FORCE_MISS
|
||||
@@ -192,7 +194,7 @@
|
||||
|
||||
//hit messages
|
||||
if(silenced)
|
||||
target_mob << "<span class='danger'>You've been hit in the [parse_zone(def_zone)] by \the [src]!</span>"
|
||||
to_chat(target_mob, "<span class='danger'>You've been hit in the [parse_zone(def_zone)] by \the [src]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!</span>")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/projectile/beam
|
||||
name = "laser"
|
||||
icon_state = "laser"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
damage = 40
|
||||
damage_type = BURN
|
||||
@@ -21,7 +22,6 @@
|
||||
/obj/item/projectile/beam/practice
|
||||
name = "laser"
|
||||
icon_state = "laser"
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
check_armour = "laser"
|
||||
@@ -32,6 +32,9 @@
|
||||
icon_state = "laser"
|
||||
damage = 15
|
||||
|
||||
/obj/item/projectile/beam/smalllaser
|
||||
damage = 25
|
||||
|
||||
/obj/item/projectile/beam/burstlaser
|
||||
damage = 30
|
||||
armor_penetration = 10
|
||||
@@ -44,6 +47,7 @@
|
||||
/obj/item/projectile/beam/heavylaser
|
||||
name = "heavy laser"
|
||||
icon_state = "heavylaser"
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
damage = 60
|
||||
armor_penetration = 30
|
||||
light_range = 3
|
||||
@@ -62,6 +66,7 @@
|
||||
/obj/item/projectile/beam/xray
|
||||
name = "xray beam"
|
||||
icon_state = "xray"
|
||||
fire_sound = 'sound/weapons/eluger.ogg'
|
||||
damage = 25
|
||||
armor_penetration = 50
|
||||
light_color = "#00CC33"
|
||||
@@ -83,8 +88,9 @@
|
||||
/obj/item/projectile/beam/pulse
|
||||
name = "pulse"
|
||||
icon_state = "u_laser"
|
||||
damage = 50
|
||||
armor_penetration = 30
|
||||
fire_sound='sound/weapons/pulse.ogg'
|
||||
damage = 100 //Badmin toy, don't care
|
||||
armor_penetration = 100
|
||||
light_color = "#0066FF"
|
||||
|
||||
muzzle_type = /obj/effect/projectile/laser_pulse/muzzle
|
||||
@@ -99,6 +105,7 @@
|
||||
/obj/item/projectile/beam/emitter
|
||||
name = "emitter beam"
|
||||
icon_state = "emitter"
|
||||
fire_sound = 'sound/weapons/emitter.ogg'
|
||||
damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm
|
||||
light_color = "#00CC33"
|
||||
|
||||
@@ -109,7 +116,6 @@
|
||||
/obj/item/projectile/beam/lastertag/blue
|
||||
name = "lasertag beam"
|
||||
icon_state = "bluelaser"
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
damage = 0
|
||||
no_attack_log = 1
|
||||
damage_type = BURN
|
||||
@@ -130,7 +136,6 @@
|
||||
/obj/item/projectile/beam/lastertag/red
|
||||
name = "lasertag beam"
|
||||
icon_state = "laser"
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
damage = 0
|
||||
no_attack_log = 1
|
||||
damage_type = BURN
|
||||
@@ -147,7 +152,6 @@
|
||||
/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE
|
||||
name = "lasertag beam"
|
||||
icon_state = "omnilaser"
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
check_armour = "laser"
|
||||
@@ -167,6 +171,7 @@
|
||||
/obj/item/projectile/beam/sniper
|
||||
name = "sniper beam"
|
||||
icon_state = "xray"
|
||||
fire_sound = 'sound/weapons/gauss_shoot.ogg'
|
||||
damage = 50
|
||||
armor_penetration = 10
|
||||
light_color = "#00CC33"
|
||||
@@ -178,6 +183,7 @@
|
||||
/obj/item/projectile/beam/stun
|
||||
name = "stun beam"
|
||||
icon_state = "stun"
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
nodamage = 1
|
||||
taser_effect = 1
|
||||
agony = 40
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/projectile/bullet
|
||||
name = "bullet"
|
||||
icon_state = "bullet"
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg'
|
||||
damage = 60
|
||||
damage_type = BRUTE
|
||||
nodamage = 0
|
||||
@@ -124,6 +125,7 @@
|
||||
/* short-casing projectiles, like the kind used in pistols or SMGs */
|
||||
|
||||
/obj/item/projectile/bullet/pistol
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_pistol.ogg'
|
||||
damage = 20
|
||||
|
||||
/obj/item/projectile/bullet/pistol/ap
|
||||
@@ -142,6 +144,7 @@
|
||||
armor_penetration = -50
|
||||
|
||||
/obj/item/projectile/bullet/pistol/strong //revolvers and matebas
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg'
|
||||
damage = 60
|
||||
|
||||
/obj/item/projectile/bullet/pistol/rubber //"rubber" bullets
|
||||
@@ -156,6 +159,7 @@
|
||||
|
||||
/obj/item/projectile/bullet/shotgun
|
||||
name = "slug"
|
||||
fire_sound = 'sound/weapons/gunshot/shotgun.ogg'
|
||||
damage = 50
|
||||
armor_penetration = 15
|
||||
|
||||
@@ -171,6 +175,7 @@
|
||||
//Overall less damage than slugs in exchange for more damage at very close range and more embedding
|
||||
/obj/item/projectile/bullet/pellet/shotgun
|
||||
name = "shrapnel"
|
||||
fire_sound = 'sound/weapons/gunshot/shotgun.ogg'
|
||||
damage = 13
|
||||
pellets = 6
|
||||
range_step = 1
|
||||
@@ -180,6 +185,7 @@
|
||||
//EMP shotgun 'slug', it's basically a beanbag that pops a tiny emp when it hits. //Not currently used
|
||||
/obj/item/projectile/bullet/shotgun/ion
|
||||
name = "ion slug"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
damage = 15
|
||||
embed_chance = 0
|
||||
sharp = 0
|
||||
@@ -194,10 +200,12 @@
|
||||
/* "Rifle" rounds */
|
||||
|
||||
/obj/item/projectile/bullet/rifle
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot3.ogg'
|
||||
armor_penetration = 15
|
||||
penetrating = 1
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot2.ogg'
|
||||
damage = 35
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762/ap
|
||||
@@ -232,6 +240,7 @@
|
||||
SA_vulnerability = SA_ANIMAL
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a145
|
||||
fire_sound = 'sound/weapons/gunshot/sniper.ogg'
|
||||
damage = 80
|
||||
stun = 3
|
||||
weaken = 3
|
||||
@@ -253,11 +262,12 @@
|
||||
|
||||
/obj/item/projectile/bullet/burstbullet
|
||||
name = "exploding bullet"
|
||||
fire_sound = 'sound/effects/Explosion1.ogg'
|
||||
damage = 20
|
||||
embed_chance = 0
|
||||
edge = 1
|
||||
|
||||
/obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0)
|
||||
/obj/item/projectile/bullet/burstbullet/on_hit(var/atom/target, var/blocked = 0)
|
||||
if(isturf(target))
|
||||
explosion(target, -1, 0, 2)
|
||||
..()
|
||||
@@ -309,6 +319,7 @@
|
||||
/obj/item/projectile/bullet/pistol/cap
|
||||
name = "cap"
|
||||
damage_type = HALLOSS
|
||||
fire_sound = null
|
||||
damage = 0
|
||||
nodamage = 1
|
||||
embed_chance = 0
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
/obj/item/projectile/energy/flash
|
||||
name = "chemical shell"
|
||||
icon_state = "bullet"
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_pistol.ogg'
|
||||
damage = 5
|
||||
kill_count = 15 //if the shell hasn't hit anything after travelling this far it just explodes.
|
||||
var/flash_range = 0
|
||||
@@ -47,6 +48,7 @@
|
||||
|
||||
//blinds people like the flash round, but can also be used for temporary illumination
|
||||
/obj/item/projectile/energy/flash/flare
|
||||
fire_sound = 'sound/weapons/gunshot/shotgun.ogg'
|
||||
damage = 10
|
||||
flash_range = 1
|
||||
brightness = 15
|
||||
@@ -63,6 +65,7 @@
|
||||
/obj/item/projectile/energy/electrode
|
||||
name = "electrode"
|
||||
icon_state = "spark"
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
taser_effect = 1
|
||||
agony = 40
|
||||
light_range = 2
|
||||
@@ -81,6 +84,7 @@
|
||||
/obj/item/projectile/energy/declone
|
||||
name = "declone"
|
||||
icon_state = "declone"
|
||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||
nodamage = 1
|
||||
damage_type = CLONE
|
||||
irradiate = 40
|
||||
@@ -106,7 +110,6 @@
|
||||
agony = 40
|
||||
stutter = 10
|
||||
|
||||
|
||||
/obj/item/projectile/energy/bolt/large
|
||||
name = "largebolt"
|
||||
damage = 20
|
||||
@@ -138,6 +141,7 @@
|
||||
/obj/item/projectile/energy/phoron
|
||||
name = "phoron bolt"
|
||||
icon_state = "energy"
|
||||
fire_sound = 'sound/effects/stealthoff.ogg'
|
||||
damage = 20
|
||||
damage_type = TOX
|
||||
irradiate = 20
|
||||
@@ -148,6 +152,7 @@
|
||||
/obj/item/projectile/energy/plasmastun
|
||||
name = "plasma pulse"
|
||||
icon_state = "plasma_stun"
|
||||
fire_sound = 'sound/weapons/blaster.ogg'
|
||||
armor_penetration = 10
|
||||
kill_count = 4
|
||||
damage = 5
|
||||
@@ -187,6 +192,7 @@
|
||||
/obj/item/projectile/energy/blue_pellet
|
||||
name = "suppressive pellet"
|
||||
icon_state = "blue_pellet"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
damage = 5
|
||||
armor_penetration = 75
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/obj/item/projectile/bullet/magnetic
|
||||
name = "rod"
|
||||
icon_state = "rod"
|
||||
fire_sound = 'sound/weapons/railgun.ogg'
|
||||
damage = 65
|
||||
stun = 1
|
||||
weaken = 1
|
||||
@@ -17,6 +18,7 @@
|
||||
/obj/item/projectile/bullet/magnetic/flechette
|
||||
name = "flechette"
|
||||
icon_state = "flechette"
|
||||
fire_sound = 'sound/weapons/rapidslice.ogg'
|
||||
damage = 20
|
||||
armor_penetration = 100
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/projectile/ion
|
||||
name = "ion bolt"
|
||||
icon_state = "ion"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
nodamage = 1
|
||||
@@ -8,17 +9,26 @@
|
||||
light_range = 2
|
||||
light_power = 0.5
|
||||
light_color = "#55AAFF"
|
||||
//var/pulse_range = 1 vorestation removal
|
||||
|
||||
var/sev1_range = 0
|
||||
var/sev2_range = 1
|
||||
var/sev3_range = 1
|
||||
var/sev4_range = 2
|
||||
|
||||
/obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0)
|
||||
empulse(target, sev1_range, sev2_range, sev3_range, sev4_range) // vorestation edit
|
||||
empulse(target, sev1_range, sev2_range, sev3_range, sev4_range)
|
||||
return 1
|
||||
|
||||
/* vorestation removal - moved to vr file
|
||||
/obj/item/projectile/ion/small
|
||||
pulse_range = 0
|
||||
*/
|
||||
sev1_range = -1
|
||||
sev2_range = 0
|
||||
sev3_range = 0
|
||||
sev4_range = 1
|
||||
|
||||
/obj/item/projectile/ion/pistol
|
||||
sev1_range = 0
|
||||
sev2_range = 0
|
||||
sev3_range = 0
|
||||
sev4_range = 0
|
||||
|
||||
/obj/item/projectile/bullet/gyro
|
||||
name ="explosive bolt"
|
||||
@@ -29,12 +39,13 @@
|
||||
edge = 1
|
||||
|
||||
/obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0)
|
||||
explosion(target, -1, 0, 2)
|
||||
return 1
|
||||
explosion(target, -1, 0, 2)
|
||||
..()
|
||||
|
||||
/obj/item/projectile/temp
|
||||
name = "freeze beam"
|
||||
icon_state = "ice_2"
|
||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
@@ -107,6 +118,7 @@
|
||||
/obj/item/projectile/energy/floramut
|
||||
name = "alpha somatoray"
|
||||
icon_state = "energy"
|
||||
fire_sound = 'sound/effects/stealthoff.ogg'
|
||||
damage = 0
|
||||
damage_type = TOX
|
||||
nodamage = 1
|
||||
@@ -150,6 +162,7 @@
|
||||
/obj/item/projectile/energy/floramut/gene
|
||||
name = "gamma somatoray"
|
||||
icon_state = "energy2"
|
||||
fire_sound = 'sound/effects/stealthoff.ogg'
|
||||
damage = 0
|
||||
damage_type = TOX
|
||||
nodamage = 1
|
||||
@@ -159,6 +172,7 @@
|
||||
/obj/item/projectile/energy/florayield
|
||||
name = "beta somatoray"
|
||||
icon_state = "energy2"
|
||||
fire_sound = 'sound/effects/stealthoff.ogg'
|
||||
damage = 0
|
||||
damage_type = TOX
|
||||
nodamage = 1
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
/obj/item/projectile/ion
|
||||
var/sev1_range = 0
|
||||
var/sev2_range = 1
|
||||
var/sev3_range = 1
|
||||
var/sev4_range = 2
|
||||
|
||||
/obj/item/projectile/ion/small
|
||||
sev1_range = -1
|
||||
sev2_range = 0
|
||||
sev3_range = 0
|
||||
sev4_range = 1
|
||||
|
||||
/obj/item/projectile/ion/pistol
|
||||
sev1_range = 0
|
||||
sev2_range = 0
|
||||
sev3_range = 0
|
||||
sev4_range = 0
|
||||
|
||||
@@ -68,6 +68,10 @@
|
||||
user.drop_item()
|
||||
B.loc = src
|
||||
user << "You add \the [loaded_pill_bottle] into the dispenser slot!"
|
||||
|
||||
else if(default_unfasten_wrench(user, B, 20))
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/chem_master/attack_hand(mob/user as mob)
|
||||
|
||||
@@ -461,11 +461,11 @@
|
||||
if(M.ingested)
|
||||
for(var/datum/reagent/R in M.ingested.reagent_list)
|
||||
if(istype(R, /datum/reagent/ethanol))
|
||||
R.dose = max(R.dose - removed * 5, 0)
|
||||
R.remove_self(removed * 5)
|
||||
if(M.bloodstr)
|
||||
for(var/datum/reagent/R in M.bloodstr.reagent_list)
|
||||
if(istype(R, /datum/reagent/ethanol))
|
||||
R.dose = max(R.dose - removed * 15, 0)
|
||||
R.remove_self(removed * 15)
|
||||
|
||||
/datum/reagent/hyronalin
|
||||
name = "Hyronalin"
|
||||
|
||||
@@ -2215,9 +2215,8 @@
|
||||
name = "Deuterium"
|
||||
id = "deuterium"
|
||||
result = null
|
||||
required_reagents = list("water" = 10)
|
||||
catalysts = list("hydrophoron" = 5)
|
||||
result_amount = 1
|
||||
required_reagents = list("hydrophoron" = 5, "water" = 10)
|
||||
result_amount = 15
|
||||
|
||||
/datum/chemical_reaction/deuterium/on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user