Merge branch 'master' into dullahan-2-electric-boogaloo
This commit is contained in:
@@ -623,7 +623,7 @@
|
||||
SSticker.start_immediately = FALSE
|
||||
SSticker.SetTimeLeft(1800)
|
||||
to_chat(world, "<b>The game will start in 180 seconds.</b>")
|
||||
SEND_SOUND(world, sound(get_announcer_sound("attention")))
|
||||
SEND_SOUND(world, sound(SSstation.announcer.get_rand_alert_sound()))
|
||||
message_admins("<font color='blue'>[usr.key] has cancelled immediate game start. Game will start in 180 seconds.</font>")
|
||||
log_admin("[usr.key] has cancelled immediate game start.")
|
||||
else
|
||||
@@ -706,7 +706,7 @@
|
||||
log_admin("[key_name(usr)] delayed the round start.")
|
||||
else
|
||||
to_chat(world, "<b>The game will start in [DisplayTimeText(newtime)].</b>", confidential = TRUE)
|
||||
SEND_SOUND(world, sound(get_announcer_sound("attention")))
|
||||
SEND_SOUND(world, sound(SSstation.announcer.get_rand_alert_sound()))
|
||||
log_admin("[key_name(usr)] set the pre-game delay to [DisplayTimeText(newtime)].")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
@@ -75,6 +75,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
|
||||
/client/proc/toggle_combo_hud, // toggle display of the combination pizza antag and taco sci/med/eng hud
|
||||
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
|
||||
/datum/admins/proc/open_shuttlepanel, /* Opens shuttle manipulator UI */
|
||||
/datum/admins/proc/station_traits_panel, /* Opens station traits UI */
|
||||
/client/proc/deadchat,
|
||||
/client/proc/toggleprayers,
|
||||
// /client/proc/toggle_prayer_sound,
|
||||
|
||||
@@ -560,7 +560,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
var/announce_command_report = TRUE
|
||||
switch(confirm)
|
||||
if("Yes")
|
||||
priority_announce(input, null, "commandreport")
|
||||
priority_announce(input, null, SSstation.announcer.get_rand_report_sound())
|
||||
announce_command_report = FALSE
|
||||
if("Cancel")
|
||||
return
|
||||
|
||||
@@ -352,7 +352,7 @@
|
||||
if(is_station_level(W.z) && !istype(get_area(W), /area/command) && !istype(get_area(W), /area/commons) && !istype(get_area(W), /area/service) && !istype(get_area(W), /area/command/heads_quarters) && !istype(get_area(W), /area/security/prison))
|
||||
W.req_access = list()
|
||||
message_admins("[key_name_admin(holder)] activated Egalitarian Station mode")
|
||||
priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, "commandreport")
|
||||
priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, SSstation.announcer.get_rand_report_sound())
|
||||
if("ancap")
|
||||
if(!is_funmin)
|
||||
return
|
||||
@@ -360,9 +360,9 @@
|
||||
SSeconomy.full_ancap = !SSeconomy.full_ancap
|
||||
message_admins("[key_name_admin(holder)] toggled Anarcho-capitalist mode")
|
||||
if(SSeconomy.full_ancap)
|
||||
priority_announce("The NAP is now in full effect.", null, "commandreport")
|
||||
priority_announce("The NAP is now in full effect.", null, SSstation.announcer.get_rand_report_sound())
|
||||
else
|
||||
priority_announce("The NAP has been revoked.", null, "commandreport")
|
||||
priority_announce("The NAP has been revoked.", null, SSstation.announcer.get_rand_report_sound())
|
||||
if("blackout")
|
||||
if(!is_funmin)
|
||||
return
|
||||
@@ -528,7 +528,7 @@
|
||||
message_admins("[key_name_admin(holder)] made everything kawaii.")
|
||||
for(var/i in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = i
|
||||
SEND_SOUND(H, sound(get_announcer_sound("animes")))
|
||||
SEND_SOUND(H, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES]))
|
||||
|
||||
if(H.dna.species.id == "human")
|
||||
if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None")
|
||||
|
||||
@@ -53,7 +53,7 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
if(!check_allowed(user) || !war_declaration)
|
||||
return
|
||||
|
||||
priority_announce(war_declaration, title = "Declaration of War", sound = 'sound/machines/alarm.ogg')
|
||||
priority_announce(war_declaration, title = "Declaration of War", sound = 'sound/machines/alarm.ogg', has_important_message = TRUE)
|
||||
|
||||
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
|
||||
|
||||
|
||||
@@ -135,12 +135,13 @@
|
||||
id = GAS_NITRIC
|
||||
specific_heat = 20
|
||||
name = "Nitric oxide"
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
odor = "sharp sweetness"
|
||||
odor_strength = 1
|
||||
fusion_power = 15
|
||||
enthalpy = 91290
|
||||
heat_resistance = 2
|
||||
powermix = -1
|
||||
heat_penalty = -1
|
||||
|
||||
/datum/gas/nitryl
|
||||
id = GAS_NITRYL
|
||||
|
||||
@@ -729,11 +729,11 @@
|
||||
/datum/gas_reaction/nitric_oxide/react(datum/gas_mixture/air, datum/holder)
|
||||
var/nitric = air.get_moles(GAS_NITRIC)
|
||||
var/oxygen = air.get_moles(GAS_O2)
|
||||
var/max_amount = max(nitric / 10, MINIMUM_MOLE_COUNT)
|
||||
var/enthalpy = air.return_temperature() * (air.heat_capacity() + R_IDEAL_GAS_EQUATION * air.total_moles());
|
||||
var/max_amount = max(nitric / 8, MINIMUM_MOLE_COUNT)
|
||||
var/enthalpy = air.return_temperature() * (air.heat_capacity() + R_IDEAL_GAS_EQUATION * air.total_moles())
|
||||
var/list/enthalpies = GLOB.gas_data.enthalpies
|
||||
if(oxygen > MINIMUM_MOLE_COUNT)
|
||||
var/reaction_amount = min(max_amount, oxygen)
|
||||
var/reaction_amount = min(max_amount, oxygen)/4
|
||||
air.adjust_moles(GAS_NITRIC, -reaction_amount*2)
|
||||
air.adjust_moles(GAS_O2, -reaction_amount)
|
||||
air.adjust_moles(GAS_NITRYL, reaction_amount*2)
|
||||
|
||||
@@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
if(can_claim())
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
D.adjust_money(reward)
|
||||
D.adjust_money(reward * SSeconomy.bounty_modifier)
|
||||
claimed = TRUE
|
||||
|
||||
// If an item sent in the cargo shuttle can satisfy the bounty.
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
|
||||
data["cart"] += list(list(
|
||||
"object" = SO.pack.name,
|
||||
"cost" = SO.pack.cost,
|
||||
"cost" = SO.pack.get_cost(),
|
||||
"id" = SO.id,
|
||||
"orderer" = SO.orderer,
|
||||
"paid" = !isnull(SO.paying_account) //paid by requester
|
||||
@@ -109,7 +109,7 @@
|
||||
for(var/datum/supply_order/SO in SSshuttle.requestlist)
|
||||
data["requests"] += list(list(
|
||||
"object" = SO.pack.name,
|
||||
"cost" = SO.pack.cost,
|
||||
"cost" = SO.pack.get_cost(),
|
||||
"orderer" = SO.orderer,
|
||||
"reason" = SO.reason,
|
||||
"id" = SO.id
|
||||
@@ -132,7 +132,7 @@
|
||||
continue
|
||||
data["supplies"][P.group]["packs"] += list(list(
|
||||
"name" = P.name,
|
||||
"cost" = P.cost,
|
||||
"cost" = P.get_cost(),
|
||||
"id" = pack,
|
||||
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
|
||||
"goody" = P.goody,
|
||||
|
||||
@@ -332,7 +332,7 @@
|
||||
/datum/export/weapon/l6sawammo
|
||||
cost = 60
|
||||
unit_name = "L6 SAW ammo box"
|
||||
export_types = list(/obj/item/ammo_box/magazine/mm195x129)
|
||||
export_types = list(/obj/item/ammo_box/magazine/mm712x82)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/rocket
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
continue // i'd be right happy to
|
||||
meme_pack_data[P.group]["packs"] += list(list(
|
||||
"name" = P.name,
|
||||
"cost" = P.cost,
|
||||
"cost" = P.get_cost(),
|
||||
"id" = pack,
|
||||
"desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
|
||||
))
|
||||
@@ -174,7 +174,7 @@
|
||||
if(D)
|
||||
points_to_check = D.account_balance
|
||||
if(!(obj_flags & EMAGGED))
|
||||
if(SO.pack.cost <= points_to_check)
|
||||
if(SO.pack.get_cost() <= points_to_check)
|
||||
var/LZ
|
||||
if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay
|
||||
LZ = get_turf(beacon)
|
||||
@@ -191,13 +191,13 @@
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
LZ = pick(empty_turfs)
|
||||
if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call
|
||||
D.adjust_money(-SO.pack.cost)
|
||||
if (SO.pack.get_cost() <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call
|
||||
D.adjust_money(-SO.pack.get_cost())
|
||||
new /obj/effect/pod_landingzone(LZ, podType, SO)
|
||||
. = TRUE
|
||||
update_icon()
|
||||
else
|
||||
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^)
|
||||
if(SO.pack.get_cost() * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^)
|
||||
landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone
|
||||
for(var/turf/open/floor/T in landingzone.contents)
|
||||
if(is_blocked_turf(T))
|
||||
@@ -205,7 +205,7 @@
|
||||
LAZYADD(empty_turfs, T)
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)))
|
||||
D.adjust_money(-(SO.pack.get_cost() * (0.72*MAX_EMAG_ROCKETS)))
|
||||
|
||||
SO.generateRequisition(get_turf(src))
|
||||
for(var/i in 1 to MAX_EMAG_ROCKETS)
|
||||
|
||||
@@ -38,6 +38,9 @@
|
||||
fill(C)
|
||||
return C
|
||||
|
||||
/datum/supply_pack/proc/get_cost()
|
||||
return cost * SSeconomy.pack_price_modifier
|
||||
|
||||
/datum/supply_pack/proc/fill(obj/structure/closet/crate/C)
|
||||
if (admin_spawned)
|
||||
for(var/item in contains)
|
||||
|
||||
@@ -233,6 +233,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
var/screenshake = 100
|
||||
var/damagescreenshake = 2
|
||||
var/recoil_screenshake = 100
|
||||
var/arousable = TRUE
|
||||
var/autostand = TRUE
|
||||
var/auto_ooc = FALSE
|
||||
@@ -907,6 +908,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Screen Shake:</b> <a href='?_src_=prefs;preference=screenshake'>[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]</a><br>"
|
||||
if (user && user.client && !user.client.prefs.screenshake==0)
|
||||
dat += "<b>Damage Screen Shake:</b> <a href='?_src_=prefs;preference=damagescreenshake'>[(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]</a><br>"
|
||||
dat += "<b>Recoil Screen Push:</b> <a href='?_src_=prefs;preference=recoil_screenshake'>[(recoil_screenshake==100) ? "Full" : ((recoil_screenshake==0) ? "None" : "[screenshake]")]</a><br>"
|
||||
var/p_chaos
|
||||
if (!preferred_chaos)
|
||||
p_chaos = "No preference"
|
||||
@@ -2782,7 +2784,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("no_tetris_storage")
|
||||
no_tetris_storage = !no_tetris_storage
|
||||
if ("screenshake")
|
||||
var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num
|
||||
var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, no maximum (at your own risk).)", "Character Preference", screenshake) as null|num
|
||||
if (!isnull(desiredshake))
|
||||
screenshake = desiredshake
|
||||
if("damagescreenshake")
|
||||
@@ -2795,6 +2797,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
damagescreenshake = 0
|
||||
else
|
||||
damagescreenshake = 1
|
||||
if ("recoil_screenshake")
|
||||
var/desiredshake = input(user, "Set the amount of recoil screenshake/push you want. \n(0 = disabled, 100 = full, no maximum (at your own risk).)", "Character Preference", screenshake) as null|num
|
||||
if (!isnull(desiredshake))
|
||||
recoil_screenshake = desiredshake
|
||||
if("nameless")
|
||||
nameless = !nameless
|
||||
//END CITADEL EDIT
|
||||
|
||||
@@ -213,6 +213,7 @@
|
||||
heat_protection = FEET|LEGS
|
||||
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF
|
||||
lace_time = 10 SECONDS
|
||||
|
||||
/obj/item/clothing/shoes/cult
|
||||
name = "\improper Nar'Sien invoker boots"
|
||||
|
||||
@@ -6,6 +6,13 @@
|
||||
earliest_start = 10 MINUTES
|
||||
max_occurrences = 6
|
||||
|
||||
/datum/round_event_control/carp_migration/New()
|
||||
. = ..()
|
||||
if(HAS_TRAIT(SSstation, STATION_TRAIT_CARP_INFESTATION))
|
||||
weight *= 3
|
||||
max_occurrences *= 2
|
||||
earliest_start *= 0.5
|
||||
|
||||
/datum/round_event/carp_migration
|
||||
announceWhen = 3
|
||||
startWhen = 50
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
// if(PIRATES_DUTCHMAN)
|
||||
// ship_name = "Flying Dutchman"
|
||||
|
||||
priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", "commandreport")
|
||||
priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", SSstation.announcer.get_rand_report_sound())
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
payoff = max(payoff_min, FLOOR(D.account_balance * 0.80, 1000))
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
fakeable = FALSE
|
||||
|
||||
/datum/round_event/untied_shoes/start()
|
||||
var/iterations = 1
|
||||
var/budget = rand(5 SECONDS,20 SECONDS)
|
||||
for(var/mob/living/carbon/C in shuffle(GLOB.alive_mob_list))
|
||||
if(!C.client)
|
||||
continue
|
||||
@@ -17,12 +17,15 @@
|
||||
continue
|
||||
if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS))
|
||||
continue
|
||||
if(!C.shoes || !C.shoes.can_be_tied || C.shoes.tied != SHOES_TIED)
|
||||
if(!C.shoes || !C.shoes.can_be_tied || C.shoes.tied != SHOES_TIED || C.shoes.lace_time > budget)
|
||||
continue
|
||||
if(!is_station_level(C.z) && prob(50))
|
||||
continue
|
||||
if(prob(5))
|
||||
C.shoes.adjust_laces(SHOES_KNOTTED)
|
||||
budget -= C.shoes.lace_time // doubling up on the budget removal on purpose
|
||||
else
|
||||
C.shoes.adjust_laces(SHOES_UNTIED)
|
||||
iterations++
|
||||
if(prob(100/iterations))
|
||||
budget -= C.shoes.lace_time
|
||||
if(budget < 5 SECONDS)
|
||||
return
|
||||
|
||||
@@ -888,7 +888,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
|
||||
if("blob alert")
|
||||
to_chat(target, "<h1 class='alert'>Biohazard Alert</h1>")
|
||||
to_chat(target, "<br><br><span class='alert'>Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.</span><br><br>")
|
||||
SEND_SOUND(target, get_announcer_sound("outbreak5"))
|
||||
SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_OUTBREAK5])
|
||||
if("ratvar")
|
||||
target.playsound_local(target, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE)
|
||||
target.playsound_local(target, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE)
|
||||
@@ -897,15 +897,15 @@ GLOBAL_LIST_INIT(hallucination_list, list(
|
||||
if("shuttle dock")
|
||||
to_chat(target, "<h1 class='alert'>Priority Announcement</h1>")
|
||||
to_chat(target, "<br><br><span class='alert'>The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.</span><br><br>")
|
||||
SEND_SOUND(target, get_announcer_sound("shuttledock"))
|
||||
SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_SHUTTLEDOCK])
|
||||
if("malf ai") //AI is doomsdaying!
|
||||
to_chat(target, "<h1 class='alert'>Anomaly Alert</h1>")
|
||||
to_chat(target, "<br><br><span class='alert'>Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.</span><br><br>")
|
||||
SEND_SOUND(target, get_announcer_sound("aimalf"))
|
||||
SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_AIMALF])
|
||||
if("meteors") //Meteors inbound!
|
||||
to_chat(target, "<h1 class='alert'>Meteor Alert</h1>")
|
||||
to_chat(target, "<br><br><span class='alert'>[generateMeteorString(rand(60, 90),FALSE,pick(GLOB.cardinals))]</span><br><br>")
|
||||
SEND_SOUND(target, get_announcer_sound("meteors"))
|
||||
SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_METEORS])
|
||||
if("supermatter")
|
||||
SEND_SOUND(target, 'sound/magic/charge.ogg')
|
||||
to_chat(target, "<span class='boldannounce'>You feel reality distort for a moment...</span>")
|
||||
|
||||
@@ -347,6 +347,9 @@
|
||||
foodtype = GRAIN | ALCOHOL
|
||||
custom_price = PRICE_PRETTY_CHEAP
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/beer/almost_empty
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/beer = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/beer/light
|
||||
name = "Carp Lite"
|
||||
desc = "Brewed with \"Pure Ice Asteroid Spring Water\"."
|
||||
|
||||
@@ -66,6 +66,9 @@
|
||||
/// Should this job be allowed to be picked for the bureaucratic error event?
|
||||
var/allow_bureaucratic_error = TRUE
|
||||
|
||||
///Is this job affected by weird spawns like the ones from station traits
|
||||
var/random_spawns_possible = TRUE
|
||||
|
||||
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
|
||||
|
||||
//If a job complies with dresscodes, loadout items will not be equipped instead of the job's outfit, instead placing the items into the player's backpack.
|
||||
@@ -109,14 +112,16 @@
|
||||
|
||||
//Only override this proc
|
||||
//H is usually a human unless an /equip override transformed it
|
||||
/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE)
|
||||
/datum/job/proc/after_spawn(mob/living/spawned, client/player_client, latejoin = FALSE)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_JOB_AFTER_SPAWN, src, spawned, player_client)
|
||||
//do actions on H but send messages to M as the key may not have been transferred_yet
|
||||
if(mind_traits)
|
||||
for(var/t in mind_traits)
|
||||
ADD_TRAIT(H.mind, t, JOB_TRAIT)
|
||||
ADD_TRAIT(spawned.mind, t, JOB_TRAIT)
|
||||
if(/datum/quirk/paraplegic in blacklisted_quirks)
|
||||
H.regenerate_limbs() //if you can't be a paraplegic, attempt to regenerate limbs to stop amputated limb selection
|
||||
H.set_resting(FALSE, TRUE) //they probably shouldn't be on the floor because they had no legs then suddenly had legs
|
||||
spawned.regenerate_limbs() //if you can't be a paraplegic, attempt to regenerate limbs to stop amputated limb selection
|
||||
spawned.set_resting(FALSE, TRUE) //they probably shouldn't be on the floor because they had no legs then suddenly had legs
|
||||
|
||||
/datum/job/proc/announce(mob/living/carbon/human/H)
|
||||
if(head_announce)
|
||||
@@ -323,3 +328,66 @@
|
||||
if(CONFIG_GET(flag/security_has_maint_access))
|
||||
return list(ACCESS_MAINT_TUNNELS)
|
||||
return list()
|
||||
|
||||
/// Handles finding and picking a valid roundstart effect landmark spawn point, in case no uncommon different spawning events occur.
|
||||
/datum/job/proc/get_default_roundstart_spawn_point()
|
||||
for(var/obj/effect/landmark/start/spawn_point as anything in GLOB.start_landmarks_list)
|
||||
if(spawn_point.name != title)
|
||||
continue
|
||||
. = spawn_point
|
||||
if(spawn_point.used) //so we can revert to spawning them on top of eachother if something goes wrong
|
||||
continue
|
||||
spawn_point.used = TRUE
|
||||
break
|
||||
if(!.)
|
||||
log_world("Couldn't find a round start spawn point for [title]")
|
||||
|
||||
/// Finds a valid latejoin spawn point, checking for events and special conditions.
|
||||
/datum/job/proc/get_latejoin_spawn_point()
|
||||
if(length(GLOB.jobspawn_overrides[title])) //We're doing something special today.
|
||||
return pick(GLOB.jobspawn_overrides[title])
|
||||
if(length(SSjob.latejoin_trackers))
|
||||
return pick(SSjob.latejoin_trackers)
|
||||
return SSjob.get_last_resort_spawn_points()
|
||||
|
||||
/// Returns an atom where the mob should spawn in.
|
||||
/datum/job/proc/get_roundstart_spawn_point(var/mob/M)
|
||||
if(random_spawns_possible)
|
||||
if(HAS_TRAIT(SSstation, STATION_TRAIT_LATE_ARRIVALS))
|
||||
return get_latejoin_spawn_point()
|
||||
if(HAS_TRAIT(SSstation, STATION_TRAIT_RANDOM_ARRIVALS))
|
||||
return get_safe_random_station_turf(typesof(/area/hallway)) || get_latejoin_spawn_point()
|
||||
if(HAS_TRAIT(SSstation, STATION_TRAIT_HANGOVER))
|
||||
if(!M || (!HAS_TRAIT(M, TRAIT_TOXIC_ALCOHOL) && !(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE) && prob(70))))
|
||||
var/obj/effect/landmark/start/hangover_spawn_point
|
||||
for(var/obj/effect/landmark/start/hangover/hangover_landmark in GLOB.start_landmarks_list)
|
||||
hangover_spawn_point = hangover_landmark
|
||||
if(hangover_landmark.used) //so we can revert to spawning them on top of eachother if something goes wrong
|
||||
continue
|
||||
hangover_landmark.used = TRUE
|
||||
break
|
||||
return hangover_spawn_point || get_latejoin_spawn_point()
|
||||
if(length(GLOB.jobspawn_overrides[title]))
|
||||
return pick(GLOB.jobspawn_overrides[title])
|
||||
var/obj/effect/landmark/start/spawn_point = get_default_roundstart_spawn_point()
|
||||
if(!spawn_point) //if there isn't a spawnpoint send them to latejoin, if there's no latejoin go yell at your mapper
|
||||
return get_latejoin_spawn_point()
|
||||
return spawn_point
|
||||
|
||||
/**
|
||||
* Called after a successful roundstart spawn.
|
||||
* Client is not yet in the mob.
|
||||
* This happens after after_spawn()
|
||||
*/
|
||||
/datum/job/proc/after_roundstart_spawn(mob/living/spawning, client/player_client)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
|
||||
/**
|
||||
* Called after a successful latejoin spawn.
|
||||
* Client is in the mob.
|
||||
* This happens after after_spawn()
|
||||
*/
|
||||
/datum/job/proc/after_latejoin_spawn(mob/living/spawning)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_JOB_AFTER_LATEJOIN_SPAWN, src, spawning)
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
exp_type_department = EXP_TYPE_SILICON
|
||||
display_order = JOB_DISPLAY_ORDER_AI
|
||||
allow_bureaucratic_error = FALSE
|
||||
random_spawns_possible = FALSE
|
||||
var/do_special_check = TRUE
|
||||
threat = 5
|
||||
considered_combat_role = TRUE
|
||||
|
||||
@@ -49,6 +49,11 @@
|
||||
|
||||
chameleon_extras = /obj/item/stamp/clown
|
||||
|
||||
/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
. = ..()
|
||||
if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS))
|
||||
backpack_contents[/obj/item/stack/sheet/mineral/bananium] = 5
|
||||
|
||||
/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
considered_combat_role = TRUE
|
||||
|
||||
random_spawns_possible = FALSE
|
||||
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CYBORG
|
||||
@@ -22,8 +22,11 @@
|
||||
CRASH("dynamic preview is unsupported")
|
||||
return H.Robotize(FALSE, latejoin)
|
||||
|
||||
/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M)
|
||||
R.updatename(M.client)
|
||||
/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, client/player_client)
|
||||
. = ..()
|
||||
if(!istype(R))
|
||||
return
|
||||
R.updatename(player_client)
|
||||
R.gender = NEUTER
|
||||
|
||||
/datum/job/cyborg/radio_help_message(mob/M)
|
||||
|
||||
@@ -7,13 +7,18 @@
|
||||
total_positions = 0
|
||||
spawn_positions = 0
|
||||
supervisors = "the security team"
|
||||
random_spawns_possible = FALSE
|
||||
|
||||
outfit = /datum/outfit/job/prisoner
|
||||
plasma_outfit = /datum/outfit/plasmaman/prisoner
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_PRISONER
|
||||
|
||||
/datum/job/prisoner/get_latejoin_spawn_point()
|
||||
return get_roundstart_spawn_point()
|
||||
|
||||
/datum/job/prisoner/after_spawn(mob/living/carbon/human/H, mob/M)
|
||||
. = ..()
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_JOB_PRISONER]
|
||||
if(policy)
|
||||
|
||||
@@ -30,8 +30,6 @@
|
||||
|
||||
var/maptype = MAP_TYPE_STATION //This should be used to adjust ingame behavior depending on the specific type of map being played. For instance, if an overmap were added, it'd be appropriate for it to only generate with a MAP_TYPE_SHIP
|
||||
|
||||
var/announcertype = "standard" //Determines the announcer the map uses. standard uses the default announcer, classic, but has a random chance to use other similarly-themed announcers, like medibot
|
||||
|
||||
var/allow_custom_shuttles = TRUE
|
||||
var/shuttles = list(
|
||||
"cargo" = "cargo_box",
|
||||
@@ -178,9 +176,6 @@
|
||||
if ("maptype" in json)
|
||||
maptype = json["maptype"]
|
||||
|
||||
if ("announcertype" in json)
|
||||
announcertype = json["announcertype"]
|
||||
|
||||
if ("orientation" in json)
|
||||
orientation = json["orientation"]
|
||||
if(!(orientation in GLOB.cardinals))
|
||||
@@ -277,7 +272,6 @@
|
||||
jsonlist["year_offset"] = year_offset
|
||||
jsonlist["minetype"] = minetype
|
||||
jsonlist["maptype"] = maptype
|
||||
jsonlist["announcertype"] = announcertype
|
||||
jsonlist["orientation"] = orientation
|
||||
jsonlist["allow_custom_shuttles"] = allow_custom_shuttles
|
||||
jsonlist["job_whitelist"] = job_whitelist
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
|
||||
sharpness = SHARP_EDGED
|
||||
actions_types = list(/datum/action/item_action/toggle_light)
|
||||
obj_flags = UNIQUE_RENAME
|
||||
var/list/trophies = list()
|
||||
var/charged = TRUE
|
||||
var/charge_time = 15
|
||||
|
||||
@@ -468,12 +468,14 @@
|
||||
SSjob.AssignRole(src, rank, 1)
|
||||
|
||||
var/mob/living/character = create_character(TRUE) //creates the human and transfers vars and mind
|
||||
var/datum/job/job = SSjob.GetJob(rank)
|
||||
|
||||
var/equip = SSjob.EquipRank(character, rank, TRUE)
|
||||
job.after_latejoin_spawn(character)
|
||||
|
||||
if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob.
|
||||
character = equip
|
||||
|
||||
var/datum/job/job = SSjob.GetJob(rank)
|
||||
|
||||
if(job && !job.override_latejoin_spawn(character))
|
||||
SSjob.SendToLateJoin(character)
|
||||
if(!arrivals_docked)
|
||||
|
||||
@@ -832,15 +832,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
var/left_state = DEFAULT_LEFT_EYE_STATE
|
||||
var/right_state = DEFAULT_RIGHT_EYE_STATE
|
||||
if(eye_type in GLOB.eye_types)
|
||||
left_state = eye_type + "_left_eye"
|
||||
right_state = eye_type + "_right_eye"
|
||||
left_state = "[eye_type]_left_eye"
|
||||
right_state = "[eye_type]_right_eye"
|
||||
var/mutable_appearance/left_eye = mutable_appearance('icons/mob/eyes.dmi', left_state, -BODY_LAYER)
|
||||
var/mutable_appearance/right_eye = mutable_appearance('icons/mob/eyes.dmi', right_state, -BODY_LAYER)
|
||||
left_eye.category = "HEAD"
|
||||
right_eye.category = "HEAD"
|
||||
if((EYECOLOR in species_traits) && has_eyes)
|
||||
left_eye.color = "#" + H.left_eye_color
|
||||
right_eye.color = "#" + H.right_eye_color
|
||||
left_eye.color = "#[H.left_eye_color]"
|
||||
right_eye.color = "#[H.right_eye_color]"
|
||||
if(OFFSET_EYES in offset_features)
|
||||
left_eye.pixel_x += offset_features[OFFSET_EYES][1]
|
||||
left_eye.pixel_y += offset_features[OFFSET_EYES][2]
|
||||
|
||||
@@ -366,6 +366,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
|
||||
|
||||
return valid
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/proc/update_corgi_fluff()
|
||||
// First, change back to defaults
|
||||
name = real_name
|
||||
|
||||
@@ -436,7 +436,7 @@ Difficulty: Very Hard
|
||||
H.dropItemToGround(W)
|
||||
var/datum/job/clown/C = new /datum/job/clown()
|
||||
C.equip(H)
|
||||
C.after_spawn(H, H, TRUE)
|
||||
C.after_spawn(H, H.client, TRUE)
|
||||
qdel(C)
|
||||
affected_targets.Add(H)
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -250,7 +250,17 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
|
||||
animate(pixel_x=oldx, pixel_y=oldy, time=1)
|
||||
|
||||
|
||||
/proc/directional_recoil(mob/M, strength=1, angle = 0)
|
||||
if(!M || !M.client)
|
||||
return
|
||||
var/client/C = M.client
|
||||
var/client_screenshake = (C.prefs.recoil_screenshake * 0.01)
|
||||
strength *= client_screenshake
|
||||
var/recoil_x = -sin(angle)*4*strength + rand(-strength, strength)
|
||||
var/recoil_y = -cos(angle)*4*strength + rand(-strength, strength)
|
||||
animate(C, pixel_x=recoil_x, pixel_y=recoil_y, time=1, easing=SINE_EASING|EASE_OUT, flags=ANIMATION_PARALLEL|ANIMATION_RELATIVE)
|
||||
animate(pixel_x=0, pixel_y=0, time=3, easing=SINE_EASING|EASE_IN) // according to bhjin this works on more recent byond versions
|
||||
// if you havent updated uuh sucks to be you then
|
||||
|
||||
/proc/findname(msg)
|
||||
if(!istext(msg))
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
continue
|
||||
data["supplies"][P.group]["packs"] += list(list(
|
||||
"name" = P.name,
|
||||
"cost" = P.cost,
|
||||
"cost" = P.get_cost(),
|
||||
"id" = pack,
|
||||
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
|
||||
"goody" = P.goody,
|
||||
@@ -131,7 +131,7 @@
|
||||
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
|
||||
data["cart"] += list(list(
|
||||
"object" = SO.pack.name,
|
||||
"cost" = SO.pack.cost,
|
||||
"cost" = SO.pack.get_cost(),
|
||||
"id" = SO.id,
|
||||
"orderer" = SO.orderer,
|
||||
"paid" = !isnull(SO.paying_account) //paid by requester
|
||||
@@ -141,7 +141,7 @@
|
||||
for(var/datum/supply_order/SO in SSshuttle.requestlist)
|
||||
data["requests"] += list(list(
|
||||
"object" = SO.pack.name,
|
||||
"cost" = SO.pack.cost,
|
||||
"cost" = SO.pack.get_cost(),
|
||||
"orderer" = SO.orderer,
|
||||
"reason" = SO.reason,
|
||||
"id" = SO.id
|
||||
|
||||
@@ -15,40 +15,29 @@
|
||||
/// Radio connection datum used by signalers.
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
/datum/computer_file/program/signaler/run_program(mob/living/user)
|
||||
. = ..()
|
||||
if (!.)
|
||||
return
|
||||
if(!computer?.get_modular_computer_part(MC_SIGNALER)) //Giving a clue to users why the program is spitting out zeros.
|
||||
to_chat(user, span_warning("\The [computer] flashes an error: \"hardware\\signal_hardware\\startup.bin -- file not found\"."))
|
||||
|
||||
/datum/computer_file/program/signaler/New()
|
||||
set_frequency(signal_frequency)
|
||||
return ..()
|
||||
|
||||
/datum/computer_file/program/signaler/ui_data(mob/user)
|
||||
var/list/data = get_header_data()
|
||||
var/obj/item/computer_hardware/radio_card/sensor = computer?.get_modular_computer_part(MC_SIGNALER)
|
||||
if(sensor?.check_functionality())
|
||||
data["frequency"] = signal_frequency
|
||||
data["code"] = signal_code
|
||||
data["minFrequency"] = MIN_FREE_FREQ
|
||||
data["maxFrequency"] = MAX_FREE_FREQ
|
||||
data["frequency"] = signal_frequency
|
||||
data["code"] = signal_code
|
||||
data["minFrequency"] = MIN_FREE_FREQ
|
||||
data["maxFrequency"] = MAX_FREE_FREQ
|
||||
return data
|
||||
|
||||
/datum/computer_file/program/signaler/ui_act(action, list/params)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
var/obj/item/computer_hardware/radio_card/sensor = computer?.get_modular_computer_part(MC_SIGNALER)
|
||||
if(!(sensor?.check_functionality()))
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 100, FALSE)
|
||||
return
|
||||
switch(action)
|
||||
if("signal")
|
||||
INVOKE_ASYNC(src, .proc/signal)
|
||||
. = TRUE
|
||||
if("freq")
|
||||
signal_frequency = unformat_frequency(params["freq"])
|
||||
signal_frequency = sanitize_frequency(signal_frequency, TRUE)
|
||||
set_frequency(signal_frequency)
|
||||
var/new_signal_frequency = sanitize_frequency(unformat_frequency(params["freq"]), TRUE)
|
||||
set_frequency(new_signal_frequency)
|
||||
. = TRUE
|
||||
if("code")
|
||||
signal_code = text2num(params["code"])
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
O.renamedByPlayer = TRUE
|
||||
|
||||
if(penchoice == "Change description")
|
||||
var/input = stripped_input(user,"Describe [O] here:", ,"[O.desc]", 140)
|
||||
var/input = stripped_input(user,"Describe [O] here:", ,"[O.desc]", 350)
|
||||
var/olddesc = O.desc
|
||||
if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE))
|
||||
return
|
||||
|
||||
@@ -1,36 +1,28 @@
|
||||
// 1.95x129mm (SAW)
|
||||
// 7.12x82mm (SAW)
|
||||
|
||||
/obj/item/ammo_casing/mm195x129
|
||||
name = "1.95x129mm bullet casing"
|
||||
desc = "A 1.95x129mm bullet casing."
|
||||
/obj/item/ammo_casing/mm712x82
|
||||
name = "7.12x82mm bullet casing"
|
||||
desc = "A 7.12x82mm bullet casing."
|
||||
icon_state = "762-casing"
|
||||
caliber = "mm195129"
|
||||
projectile_type = /obj/item/projectile/bullet/mm195x129
|
||||
caliber = "mm71282"
|
||||
projectile_type = /obj/item/projectile/bullet/mm712x82
|
||||
|
||||
/obj/item/ammo_casing/mm195x129/ap
|
||||
name = "1.95x129mm armor-piercing bullet casing"
|
||||
desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
|
||||
projectile_type = /obj/item/projectile/bullet/mm195x129_ap
|
||||
/obj/item/ammo_casing/mm712x82/ap
|
||||
name = "7.12x82mm armor-piercing bullet casing"
|
||||
desc = "A 7.12x82mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
|
||||
projectile_type = /obj/item/projectile/bullet/mm712x82_ap
|
||||
|
||||
/obj/item/ammo_casing/mm195x129/hollow
|
||||
name = "1.95x129mm hollow-point bullet casing"
|
||||
desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
|
||||
projectile_type = /obj/item/projectile/bullet/mm195x129_hp
|
||||
/obj/item/ammo_casing/mm712x82/hollow
|
||||
name = "7.12x82mm hollow-point bullet casing"
|
||||
desc = "A 7.12x82mm bullet casing designed to cause more damage to unarmored targets."
|
||||
projectile_type = /obj/item/projectile/bullet/mm712x82_hp
|
||||
|
||||
/obj/item/ammo_casing/mm195x129/incen
|
||||
name = "1.95x129mm incendiary bullet casing"
|
||||
desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames."
|
||||
projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129
|
||||
/obj/item/ammo_casing/mm712x82/incen
|
||||
name = "7.12x82mm incendiary bullet casing"
|
||||
desc = "A 7.12x82mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames."
|
||||
projectile_type = /obj/item/projectile/bullet/incendiary/mm712x82
|
||||
|
||||
/obj/item/ammo_casing/mm712x82/match
|
||||
name = "7.12x82mm match bullet casing"
|
||||
desc = "A 7.12x82mm bullet casing manufactured to unfailingly high standards, you could pull off some cool trickshots with this."
|
||||
projectile_type = /obj/item/projectile/bullet/mm712x82_match
|
||||
|
||||
/obj/item/projectile/bullet/mm712x82_match
|
||||
name = "7.12x82mm match bullet"
|
||||
damage = 40
|
||||
ricochets_max = 2
|
||||
ricochet_chance = 60
|
||||
ricochet_auto_aim_range = 4
|
||||
ricochet_incidence_leeway = 35
|
||||
projectile_type = /obj/item/projectile/bullet/mm712x82/match
|
||||
|
||||
+14
-14
@@ -1,23 +1,23 @@
|
||||
/obj/item/ammo_box/magazine/mm195x129
|
||||
name = "box magazine (1.95x129mm)"
|
||||
/obj/item/ammo_box/magazine/mm712x82
|
||||
name = "box magazine (7.12x82mm)"
|
||||
icon_state = "a762-50"
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129
|
||||
caliber = "mm195129"
|
||||
ammo_type = /obj/item/ammo_casing/mm712x82
|
||||
caliber = "mm71282"
|
||||
max_ammo = 50
|
||||
|
||||
/obj/item/ammo_box/magazine/mm195x129/hollow
|
||||
name = "box magazine (Hollow-Point 1.95x129mm)"
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129/hollow
|
||||
/obj/item/ammo_box/magazine/mm712x82/hollow
|
||||
name = "box magazine (Hollow-Point 7.12x82mm)"
|
||||
ammo_type = /obj/item/ammo_casing/mm712x82/hollow
|
||||
|
||||
/obj/item/ammo_box/magazine/mm195x129/ap
|
||||
name = "box magazine (Armor Penetrating 1.95x129mm)"
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129/ap
|
||||
/obj/item/ammo_box/magazine/mm712x82/ap
|
||||
name = "box magazine (Armor Penetrating 7.12x82mm)"
|
||||
ammo_type = /obj/item/ammo_casing/mm712x82/ap
|
||||
|
||||
/obj/item/ammo_box/magazine/mm195x129/incen
|
||||
name = "box magazine (Incendiary 1.95x129mm)"
|
||||
ammo_type = /obj/item/ammo_casing/mm195x129/incen
|
||||
/obj/item/ammo_box/magazine/mm712x82/incen
|
||||
name = "box magazine (Incendiary 7.12x82mm)"
|
||||
ammo_type = /obj/item/ammo_casing/mm712x82/incen
|
||||
|
||||
/obj/item/ammo_box/magazine/mm195x129/update_icon()
|
||||
/obj/item/ammo_box/magazine/mm712x82/update_icon()
|
||||
..()
|
||||
icon_state = "a762-[round(ammo_count(),10)]"
|
||||
|
||||
|
||||
@@ -94,6 +94,9 @@
|
||||
|
||||
var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds
|
||||
|
||||
/// directional recoil multiplier
|
||||
var/dir_recoil_amp = 10
|
||||
|
||||
/obj/item/gun/Initialize(mapload)
|
||||
. = ..()
|
||||
if(no_pin_required)
|
||||
@@ -159,7 +162,7 @@
|
||||
|
||||
/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0)
|
||||
if(recoil)
|
||||
shake_camera(user, recoil + 1, recoil)
|
||||
directional_recoil(user, recoil*dir_recoil_amp, Get_Angle(user, pbtarget))
|
||||
|
||||
if(stam_cost) //CIT CHANGE - makes gun recoil cause staminaloss
|
||||
var/safe_cost = clamp(stam_cost, 0, user.stamina_buffer)*(firing && burst_size >= 2 ? 1/burst_size : 1)
|
||||
|
||||
@@ -296,13 +296,13 @@
|
||||
|
||||
/obj/item/gun/ballistic/automatic/l6_saw
|
||||
name = "\improper L6 SAW"
|
||||
desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
|
||||
desc = "A heavily modified 7.12x82mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
|
||||
icon_state = "l6closed100"
|
||||
item_state = "l6closedmag"
|
||||
fire_sound = "sound/weapons/lmgshot.ogg"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
slot_flags = 0
|
||||
mag_type = /obj/item/ammo_box/magazine/mm195x129
|
||||
mag_type = /obj/item/ammo_box/magazine/mm712x82
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
var/cover_open = FALSE
|
||||
can_suppress = FALSE
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
icon_state = "goldrevolver"
|
||||
fire_sound = 'sound/weapons/resonator_blast.ogg'
|
||||
recoil = 8
|
||||
dir_recoil_amp = 5 // 40 directional recoil is already really funny
|
||||
pin = /obj/item/firing_pin
|
||||
|
||||
/obj/item/gun/ballistic/revolver/nagant
|
||||
|
||||
@@ -21,22 +21,22 @@
|
||||
/obj/item/projectile/bullet/syndicate_turret
|
||||
damage = 20
|
||||
|
||||
// 1.95x129mm (SAW)
|
||||
// 7.12x82mm (SAW)
|
||||
|
||||
/obj/item/projectile/bullet/mm195x129
|
||||
name = "1.95x129mm bullet"
|
||||
/obj/item/projectile/bullet/mm712x82
|
||||
name = "7.12x82mm bullet"
|
||||
damage = 40
|
||||
armour_penetration = 5
|
||||
wound_bonus = -50
|
||||
wound_falloff_tile = 0
|
||||
|
||||
/obj/item/projectile/bullet/mm195x129_ap
|
||||
name = "1.95x129mm armor-piercing bullet"
|
||||
/obj/item/projectile/bullet/mm712x82_ap
|
||||
name = "7.12x82mm armor-piercing bullet"
|
||||
damage = 40
|
||||
armour_penetration = 75
|
||||
|
||||
/obj/item/projectile/bullet/mm195x129_hp
|
||||
name = "1.95x129mm hollow-point bullet"
|
||||
/obj/item/projectile/bullet/mm712x82_hp
|
||||
name = "7.12x82mm hollow-point bullet"
|
||||
damage = 50
|
||||
armour_penetration = -60
|
||||
sharpness = SHARP_EDGED
|
||||
@@ -44,7 +44,15 @@
|
||||
bare_wound_bonus = 30
|
||||
wound_falloff_tile = -8
|
||||
|
||||
/obj/item/projectile/bullet/incendiary/mm195x129
|
||||
name = "1.95x129mm incendiary bullet"
|
||||
/obj/item/projectile/bullet/incendiary/mm712x82
|
||||
name = "7.12x82mm incendiary bullet"
|
||||
damage = 20
|
||||
fire_stacks = 3
|
||||
|
||||
/obj/item/projectile/bullet/mm712x82/match
|
||||
name = "7.12x82mm match bullet"
|
||||
damage = 40
|
||||
ricochets_max = 2
|
||||
ricochet_chance = 60
|
||||
ricochet_auto_aim_range = 4
|
||||
ricochet_incidence_leeway = 35
|
||||
|
||||
@@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
|
||||
if(!empty_turfs.len)
|
||||
break
|
||||
var/price = SO.pack.cost
|
||||
var/price = SO.pack.get_cost()
|
||||
if(SO.applied_coupon)
|
||||
price *= (1 - SO.applied_coupon.discount_pct_off)
|
||||
|
||||
@@ -163,8 +163,8 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
LAZYADD(goodies_by_buyer[SO.paying_account], SO)
|
||||
D.bank_card_talk("Cargo order #[SO.id] has shipped. [price] credits have been charged to your bank account.")
|
||||
var/datum/bank_account/department/cargo = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
cargo.adjust_money(price - SO.pack.cost) //Cargo gets the handling fee
|
||||
value += SO.pack.cost
|
||||
cargo.adjust_money(price - SO.pack.get_cost()) //Cargo gets the handling fee
|
||||
value += SO.pack.get_cost()
|
||||
SSshuttle.shoppinglist -= SO
|
||||
SSshuttle.orderhistory += SO
|
||||
QDEL_NULL(SO.applied_coupon)
|
||||
@@ -172,7 +172,7 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
if(!SO.pack.goody && !ispath(SO.pack.crate_type, /obj/structure/closet/secure_closet/cargo)) //we handle goody crates and material closets below
|
||||
SO.generate(pick_n_take(empty_turfs))
|
||||
|
||||
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
|
||||
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.get_cost()]", "[SO.pack.name]"))
|
||||
investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]), paid by [D.account_holder] has shipped.", INVESTIGATE_CARGO)
|
||||
if(SO.pack.dangerous)
|
||||
message_admins("\A [SO.pack.name] ordered by [ADMIN_LOOKUPFLW(SO.orderer_ckey)], paid by [D.account_holder] has shipped.")
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/report_message = "Complete this goal."
|
||||
|
||||
/datum/station_goal/proc/send_report()
|
||||
priority_announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", "commandreport")
|
||||
priority_announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", SSstation.announcer.get_rand_report_sound())
|
||||
print_command_report(get_report(),"Nanotrasen Directive [pick(GLOB.phonetic_alphabet)] \Roman[rand(1,50)]", announce=FALSE)
|
||||
on_report()
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
|
||||
/datum/tcg_card/pack_nuclear/l6saw
|
||||
name = "L6 Saw LMG"
|
||||
desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
|
||||
desc = "A heavily modified 7.12x82mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
|
||||
rules = "After equipped unit dies, this card goes to the bottom of draw deck"
|
||||
icon_state = "l6saw"
|
||||
|
||||
|
||||
@@ -209,29 +209,29 @@
|
||||
purchasable_from = UPLINK_NUKE_OPS
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/basic
|
||||
name = "1.95x129mm Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \
|
||||
name = "7.12x82mm Box Magazine"
|
||||
desc = "A 50-round magazine of 7.12x82mm ammunition for use with the L6 SAW. \
|
||||
By the time you need to use this, you'll already be standing on a pile of corpses"
|
||||
item = /obj/item/ammo_box/magazine/mm195x129
|
||||
item = /obj/item/ammo_box/magazine/mm712x82
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/ap
|
||||
name = "1.95x129mm (Armor Penetrating) Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
|
||||
name = "7.12x82mm (Armor Penetrating) Box Magazine"
|
||||
desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; equipped with special properties \
|
||||
to puncture even the most durable armor."
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/ap
|
||||
item = /obj/item/ammo_box/magazine/mm712x82/ap
|
||||
cost = 9
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/hollow
|
||||
name = "1.95x129mm (Hollow-Point) Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
|
||||
name = "7.12x82mm (Hollow-Point) Box Magazine"
|
||||
desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
|
||||
with the unarmored masses of crew."
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/hollow
|
||||
item = /obj/item/ammo_box/magazine/mm712x82/hollow
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/incen
|
||||
name = "1.95x129mm (Incendiary) Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; tipped with a special flammable \
|
||||
name = "7.12x82mm (Incendiary) Box Magazine"
|
||||
desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; tipped with a special flammable \
|
||||
mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn."
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/incen
|
||||
item = /obj/item/ammo_box/magazine/mm712x82/incen
|
||||
|
||||
/datum/uplink_item/ammo/rocket
|
||||
purchasable_from = UPLINK_NUKE_OPS
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
/datum/uplink_item/dangerous/machinegun
|
||||
name = "L6 Squad Automatic Weapon"
|
||||
desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \
|
||||
This deadly weapon has a massive 50-round magazine of devastating 1.95x129mm ammunition."
|
||||
This deadly weapon has a massive 50-round magazine of devastating 7.12x82mm ammunition."
|
||||
item = /obj/item/gun/ballistic/automatic/l6_saw
|
||||
cost = 18
|
||||
surplus = 0
|
||||
|
||||
Reference in New Issue
Block a user