Compare commits
12 Commits
bfeded12b5
...
028c37002c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
028c37002c | ||
|
|
42689bc40e | ||
|
|
51065a524e | ||
|
|
97c4cefd11 | ||
|
|
8b40c298bf | ||
|
|
3f2e19eddd | ||
|
|
7678e98fa0 | ||
|
|
ad098d4984 | ||
|
|
75cb94ac7f | ||
|
|
65f1d3550e | ||
|
|
ef39646552 | ||
|
|
e956d74639 |
25
citadel.dme
@@ -74,6 +74,7 @@
|
||||
#include "code\__DEFINES\recipes.dm"
|
||||
#include "code\__DEFINES\robots.dm"
|
||||
#include "code\__DEFINES\roguemining_vr.dm"
|
||||
#include "code\__DEFINES\role_preferences.dm"
|
||||
#include "code\__DEFINES\rust_g.dm"
|
||||
#include "code\__DEFINES\screen.dm"
|
||||
#include "code\__DEFINES\shields.dm"
|
||||
@@ -298,6 +299,7 @@
|
||||
#include "code\__DEFINES\procs\update_icon.dm"
|
||||
#include "code\__DEFINES\projectiles\ammo_casing.dm"
|
||||
#include "code\__DEFINES\projectiles\ammo_magazine.dm"
|
||||
#include "code\__DEFINES\projectiles\gun.dm"
|
||||
#include "code\__DEFINES\projectiles\guns.dm"
|
||||
#include "code\__DEFINES\projectiles\projectile.dm"
|
||||
#include "code\__DEFINES\projectiles\system.dm"
|
||||
@@ -576,6 +578,7 @@
|
||||
#include "code\controllers\subsystem\research.dm"
|
||||
#include "code\controllers\subsystem\server_maint.dm"
|
||||
#include "code\controllers\subsystem\shuttles.dm"
|
||||
#include "code\controllers\subsystem\simple_networks.dm"
|
||||
#include "code\controllers\subsystem\sonar.dm"
|
||||
#include "code\controllers\subsystem\spacedrift.dm"
|
||||
#include "code\controllers\subsystem\spatial_grids.dm"
|
||||
@@ -632,8 +635,6 @@
|
||||
#include "code\controllers\subsystem\mapping\spatial_helpers\loc.dm"
|
||||
#include "code\controllers\subsystem\mapping\spatial_helpers\stack.dm"
|
||||
#include "code\controllers\subsystem\mapping\spatial_helpers\step.dm"
|
||||
#include "code\controllers\subsystem\networks\_networks.dm"
|
||||
#include "code\controllers\subsystem\networks\simple.dm"
|
||||
#include "code\controllers\subsystem\persistence\bunker.dm"
|
||||
#include "code\controllers\subsystem\persistence\entity_operations.dm"
|
||||
#include "code\controllers\subsystem\persistence\persistence.dm"
|
||||
@@ -902,7 +903,6 @@
|
||||
#include "code\datums\recipe\stack_recipes\frame.dm"
|
||||
#include "code\datums\recipe\stack_recipes\misc.dm"
|
||||
#include "code\datums\recipe\stack_recipes\structures.dm"
|
||||
#include "code\datums\repositories\ammomaterial.dm"
|
||||
#include "code\datums\repositories\cameras.dm"
|
||||
#include "code\datums\repositories\crew.dm"
|
||||
#include "code\datums\repositories\decls.dm"
|
||||
@@ -1023,6 +1023,7 @@
|
||||
#include "code\game\area\Space Station 13 areas.dm"
|
||||
#include "code\game\area\ss13_deprecated_areas.dm"
|
||||
#include "code\game\area\Tether_areas.dm"
|
||||
#include "code\game\area\victory_areas.dm"
|
||||
#include "code\game\area\station\exporation.dm"
|
||||
#include "code\game\area\station\security_areas.dm"
|
||||
#include "code\game\atoms\action_feedback.dm"
|
||||
@@ -1068,9 +1069,16 @@
|
||||
#include "code\game\content\factions\corporations\corporation.dm"
|
||||
#include "code\game\content\factions\corporations\gorlex\items\guns\phoron_spitter.dm"
|
||||
#include "code\game\content\factions\corporations\gorlex\items\guns\wild_hunt.dm"
|
||||
#include "code\game\content\factions\corporations\hephaestus\hephaestus-faction.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\nanotrasen-faction.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\nanotrasen-supply.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\pulse.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\nt_expeditionary-antimaterial.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\nt_expeditionary-heavy_rifle.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\nt_expeditionary-heavy_sidearm.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\nt_expeditionary-light_rifle.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\nt_expeditionary-light_sidearm.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\nt_expeditionary.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\items\guns\nt_pulse.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\nanotrasen-supply\animals.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\nanotrasen-supply\atmospherics.dm"
|
||||
#include "code\game\content\factions\corporations\nanotrasen\nanotrasen-supply\contraband.dm"
|
||||
@@ -2190,6 +2198,7 @@
|
||||
#include "code\modules\admin\verbs\debug\fucky_wucky.dm"
|
||||
#include "code\modules\admin\verbs\debug\profiling.dm"
|
||||
#include "code\modules\admin\verbs\debug\reestablish_db_connection.dm"
|
||||
#include "code\modules\admin\verbs\debug\spawn.dm"
|
||||
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
|
||||
#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm"
|
||||
#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm"
|
||||
@@ -3960,6 +3969,10 @@
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\proteon.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\nuclear\burning.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\nuclear\charred.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\nuclear\demoncore.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\nuclear\gammawraith.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm"
|
||||
@@ -4126,10 +4139,6 @@
|
||||
#include "code\modules\nano\modules\human_appearance.dm"
|
||||
#include "code\modules\nano\modules\law_manager.dm"
|
||||
#include "code\modules\nano\modules\nano_module.dm"
|
||||
#include "code\modules\networks\simple\atom.dm"
|
||||
#include "code\modules\networks\simple\datum.dm"
|
||||
#include "code\modules\networks\simple\element.dm"
|
||||
#include "code\modules\networks\simple\helpers.dm"
|
||||
#include "code\modules\nifsoft\augmented_holder.dm"
|
||||
#include "code\modules\nifsoft\nif.dm"
|
||||
#include "code\modules\nifsoft\nif_softshop.dm"
|
||||
|
||||
@@ -93,6 +93,8 @@
|
||||
#define COLOR_SECURITY_RED "#b3363c"
|
||||
#define COLOR_ATMOSPHERICS_CYAN "#73a6bf"
|
||||
#define COLOR_CARGO_BROWN "#805f40"
|
||||
#define COLOR_NAV_BLUE "#5b5bc2"
|
||||
#define COLOR_NAV_GOLD "#f3bc4f"
|
||||
|
||||
#define WOOD_COLOR_GENERIC "#d5a66e"
|
||||
#define WOOD_COLOR_RICH "#792f27"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 silicons *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* /obj/item/ammo_casing casing_flags *//
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 silicons *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* /obj/item/ammo_magazine magazine_type
|
||||
//* /obj/item/ammo_magazine - magazine_type *//
|
||||
|
||||
/// normal magazines
|
||||
///
|
||||
/// * basically, straight or curved 'stick' magazines
|
||||
#define MAGAZINE_TYPE_NORMAL (1<<0)
|
||||
/// revolver-like speedloader
|
||||
#define MAGAZINE_TYPE_SPEEDLOADER (1<<1)
|
||||
@@ -12,6 +14,8 @@
|
||||
/// loose pouch
|
||||
#define MAGAZINE_TYPE_POUCH (1<<3)
|
||||
/// structured box
|
||||
///
|
||||
/// * this refers to LMG-like box magazine, not what we call just generally normal magazines
|
||||
#define MAGAZINE_TYPE_BOX (1<<3)
|
||||
|
||||
DEFINE_BITFIELD_NEW(ammo_magazine_types, list(
|
||||
@@ -25,3 +29,23 @@ DEFINE_BITFIELD_NEW(ammo_magazine_types, list(
|
||||
BITFIELD_NEW("Ammo Pouch", MAGAZINE_TYPE_POUCH),
|
||||
BITFIELD_NEW("Ammo Box", MAGAZINE_TYPE_BOX),
|
||||
))
|
||||
|
||||
//* /obj/item/ammo_magazine - magazine_class *//
|
||||
|
||||
/// renders as -mag
|
||||
///
|
||||
/// * if a magazine's class isn't in a gun's render_magazine_overlay, we use this state
|
||||
#define MAGAZINE_CLASS_GENERIC (1<<0)
|
||||
/// renders as -mag-drum
|
||||
#define MAGAZINE_CLASS_DRUM (1<<1)
|
||||
/// renders as -mag-ext
|
||||
#define MAGAZINE_CLASS_EXTENDED (1<<2)
|
||||
/// renders as -mag-box
|
||||
#define MAGAZINE_CLASS_BOX (1<<3)
|
||||
|
||||
GLOBAL_REAL_LIST(magazine_class_bit_to_state) = list(
|
||||
"mag",
|
||||
"mag-drum",
|
||||
"mag-ext",
|
||||
"mag-box",
|
||||
)
|
||||
|
||||
28
code/__DEFINES/projectiles/gun.dm
Normal file
@@ -0,0 +1,28 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* rendering enums - /obj/item/gun/ballistic *//
|
||||
|
||||
//? render_bolt_overlay
|
||||
|
||||
/// do not render bolt state
|
||||
#define BALLISTIC_RENDER_BOLT_NEVER 0
|
||||
/// render `[base state]-bolt` if open
|
||||
#define BALLISTIC_RENDER_BOLT_OPEN 1
|
||||
/// render `[base state]-bolt` if closed
|
||||
#define BALLISTIC_RENDER_BOLT_CLOSE 2
|
||||
/// * render `[base state]-bolt-open` if open
|
||||
/// * render `[base state]-bolt-close` if closed
|
||||
#define BALLISTIC_RENDER_BOLT_BOTH 3
|
||||
|
||||
//? render_break_overlay
|
||||
|
||||
/// do not render break-action state
|
||||
#define BALLISTIC_RENDER_BREAK_NEVER 0
|
||||
/// render `[base state]-break` if open
|
||||
#define BALLISTIC_RENDER_BREAK_OPEN 1
|
||||
/// render `[base state]-break` if closed
|
||||
#define BALLISTIC_RENDER_BREAK_CLOSE 2
|
||||
/// * render `[base state]-break-open` if open
|
||||
/// * render `[base state]-break-close` if closed
|
||||
#define BALLISTIC_RENDER_BREAK_BOTH 3
|
||||
1
code/__DEFINES/role_preferences.dm
Normal file
@@ -0,0 +1 @@
|
||||
#define ROLE_GHOST "ghost"
|
||||
@@ -97,6 +97,7 @@
|
||||
#define VV_HK_EDIT_ARMOR "edit_armor"
|
||||
|
||||
// /mob
|
||||
#define VV_HK_TRIGGER_OFFER_MOB_TO_GHOSTS "offer_mob_to_ghosts"
|
||||
/// used on /mob as well as /obj/item/organ
|
||||
#define VV_HK_ADD_PHYSIOLOGY_MODIFIER "add_physiology_mod"
|
||||
/// used on /mob as well as /obj/item/organ
|
||||
|
||||
@@ -583,3 +583,4 @@
|
||||
hear |= recursive_mob_check(A, hear, 3, 1, 0, 1)
|
||||
|
||||
return hear
|
||||
|
||||
|
||||
@@ -1,54 +1,54 @@
|
||||
/**
|
||||
* todo: rename this
|
||||
*
|
||||
* Reformat types to be more readable for admin interfaces.
|
||||
*
|
||||
* This is done because BYOND is hell and "input in list" is obnoxious.
|
||||
*/
|
||||
/proc/make_types_fancy(list/types)
|
||||
if (ispath(types))
|
||||
types = list(types)
|
||||
. = list()
|
||||
var/static/list/shortcut_lookup = list(
|
||||
/obj/effect/debris = "//debris",
|
||||
/obj/item/radio/headset = "//headset",
|
||||
/obj/item/reagent_containers/food/drinks = "//drink",
|
||||
/obj/item/reagent_containers/food = "//food",
|
||||
/obj/machinery/atmospherics = "//atmos",
|
||||
/obj/machinery/portable_atmospherics = "//port_atmos",
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon = "//mech_weapon",
|
||||
/obj/item/mecha_parts = "//mech_part",
|
||||
/obj/item/organ = "//organ",
|
||||
/obj/item/gun/ballistic = "//ballistic",
|
||||
/obj/item/gun/energy = "//energy",
|
||||
/obj/item/gun/magnetic = "//magnetic",
|
||||
/obj/item/gun = "//gun",
|
||||
/obj/item/ammo_casing = "//ammo",
|
||||
/obj/item/ammo_magazine = "//magazine",
|
||||
/obj/item = "//item",
|
||||
/obj/machinery = "//machine",
|
||||
/obj/effect = "//effect",
|
||||
/atom/movable = "//movable",
|
||||
/turf/simulated/floor = "//floor",
|
||||
/turf/simulated = "//simulated",
|
||||
/mob/living/carbon = "//carbon",
|
||||
/mob/living/simple_mob = "//simple",
|
||||
/mob/living = "//living",
|
||||
)
|
||||
for(var/type in types)
|
||||
var/typename = "[type]"
|
||||
var/static/list/TYPES_SHORTCUTS = list(
|
||||
/obj/effect/debris/cleanable = "CLEANABLE",
|
||||
/obj/item/radio/headset = "HEADSET",
|
||||
/obj/item/clothing/head/helmet/space = "SPESSHELMET",
|
||||
// /obj/item/book/manual = "MANUAL",
|
||||
// /obj/item/reagent_containers/food/drinks = "DRINK", //longest paths comes first
|
||||
// /obj/item/reagent_containers/food = "FOOD",
|
||||
// /obj/item/reagent_containers = "REAGENT_CONTAINERS",
|
||||
/obj/machinery/atmospherics = "ATMOS_MACH",
|
||||
/obj/machinery/portable_atmospherics = "PORT_ATMOS",
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK",
|
||||
/obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP",
|
||||
/obj/item/organ = "ORGAN",
|
||||
/obj/item = "ITEM",
|
||||
/obj/machinery = "MACHINERY",
|
||||
/obj/effect = "EFFECT",
|
||||
/obj = "O",
|
||||
/datum = "D",
|
||||
// /turf/open = "OPEN",
|
||||
// /turf/closed = "CLOSED",
|
||||
/turf = "T",
|
||||
/mob/living/carbon = "CARBON",
|
||||
/mob/living/simple_animal = "SIMPLE",
|
||||
/mob/living = "LIVING",
|
||||
/mob = "M",
|
||||
)
|
||||
for (var/tn in TYPES_SHORTCUTS)
|
||||
if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ )
|
||||
typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/"))
|
||||
var/shortcut
|
||||
for(var/prefix in shortcut_lookup)
|
||||
if(ispath(type, prefix))
|
||||
shortcut = "[shortcut_lookup[prefix]][copytext("[type]", length("[prefix]") + 1)]"
|
||||
break
|
||||
.[typename] = type
|
||||
.[shortcut || "[type]"] = type
|
||||
|
||||
/proc/get_fancy_list_of_atom_types()
|
||||
var/static/list/pre_generated_list
|
||||
if (!pre_generated_list) //init
|
||||
pre_generated_list = make_types_fancy(typesof(/atom))
|
||||
return pre_generated_list
|
||||
return make_types_fancy(typesof(/atom))
|
||||
|
||||
|
||||
/proc/get_fancy_list_of_datum_types()
|
||||
var/static/list/pre_generated_list
|
||||
if (!pre_generated_list) //init
|
||||
pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom)))
|
||||
return pre_generated_list
|
||||
|
||||
return make_types_fancy(typesof(/datum) - typesof(/atom))
|
||||
|
||||
/proc/filter_fancy_list(list/L, filter as text)
|
||||
var/list/matches = new
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
SUBSYSTEM_DEF(networks)
|
||||
name = "Networks"
|
||||
subsystem_flags = SS_NO_FIRE
|
||||
// no init order for now
|
||||
// no fire priority for now
|
||||
|
||||
// Simple networks
|
||||
/// id lookup to a list of devices
|
||||
var/static/list/simple_network_lookup = list()
|
||||
@@ -1,19 +0,0 @@
|
||||
/**
|
||||
* Returns list of devices on a simple network.
|
||||
*
|
||||
* **WARNING: LIST IS NOT A COPY FOR PERFORMANCE - DO NOT MODIFY WITHOUT COPYING.**
|
||||
*/
|
||||
/datum/controller/subsystem/networks/proc/GetSimpleDevices(id)
|
||||
return simple_network_lookup[id] || list()
|
||||
|
||||
/**
|
||||
* Returns list of devices on a simple network within distance of atom
|
||||
*/
|
||||
/datum/controller/subsystem/networks/proc/GetSimpleDevicesRange(id, atom/center, range = 25)
|
||||
center = get_turf(center)
|
||||
if(!center)
|
||||
return list()
|
||||
. = list()
|
||||
for(var/atom/A in GetSimpleDevices(id))
|
||||
if(get_dist(A, center) <= range)
|
||||
. += A
|
||||
100
code/controllers/subsystem/simple_networks.dm
Normal file
@@ -0,0 +1,100 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
/**
|
||||
* Just a simple way for things to send / receive data
|
||||
*/
|
||||
SUBSYSTEM_DEF(simple_networks)
|
||||
name = "Simple Networks"
|
||||
subsystem_flags = SS_NO_FIRE
|
||||
// no init order for now
|
||||
// no fire priority for now
|
||||
|
||||
// Simple networks
|
||||
/// id lookup to a list of devices
|
||||
var/static/list/simple_network_lookup = list()
|
||||
|
||||
/**
|
||||
* Returns list of devices on a simple network.
|
||||
*
|
||||
* **WARNING: LIST IS NOT A COPY FOR PERFORMANCE - DO NOT MODIFY WITHOUT COPYING.**
|
||||
*/
|
||||
/datum/controller/subsystem/simple_networks/proc/get_devices(id)
|
||||
return simple_network_lookup[id] || list()
|
||||
|
||||
/**
|
||||
* Returns list of devices on a simple network within distance of atom
|
||||
*/
|
||||
/datum/controller/subsystem/simple_networks/proc/get_devices_in_range(id, atom/center, range = 25)
|
||||
center = get_turf(center)
|
||||
if(!center)
|
||||
return list()
|
||||
. = list()
|
||||
for(var/atom/A in get_devices(id))
|
||||
if(get_dist(A, center) <= range)
|
||||
. += A
|
||||
|
||||
//* /datum API *//
|
||||
|
||||
/datum/proc/simple_network_register(id)
|
||||
AddElement(/datum/element/simple_network, id)
|
||||
|
||||
/**
|
||||
* Sends a simple network message.
|
||||
*
|
||||
* @params
|
||||
* * id - id of network to send to
|
||||
* * message - message to send or null
|
||||
* * data - arbitrary list or null
|
||||
*/
|
||||
/datum/proc/simple_network_send(id, message, list/data)
|
||||
var/list/devices = SSsimple_networks.get_devices(id)
|
||||
for(var/datum/D as anything in devices)
|
||||
D.simple_network_receive(id, message, data, src)
|
||||
|
||||
/**
|
||||
* Called on receiving a simple network message - register to these by adding the element.
|
||||
*/
|
||||
/datum/proc/simple_network_receive(id, message, list/data, datum/sender)
|
||||
return
|
||||
|
||||
//* /atom API *//
|
||||
|
||||
/**
|
||||
* Sends a simple network message.
|
||||
*
|
||||
* @params
|
||||
* * id - id of network to send to
|
||||
* * message - message to send or null
|
||||
* * data - arbitrary list or null
|
||||
* * range - range from the current atom, defaults to ignoring.
|
||||
*/
|
||||
/atom/simple_network_send(id, message, list/data, range = INFINITY)
|
||||
if(range == INFINITY)
|
||||
return ..()
|
||||
var/list/devices = SSsimple_networks.get_devices_in_range(id, src, range)
|
||||
for(var/datum/D as anything in devices)
|
||||
D.simple_network_receive(id, message, data, src)
|
||||
|
||||
//* Internal Element *//
|
||||
|
||||
/datum/element/simple_network
|
||||
element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
|
||||
id_arg_index = 1
|
||||
var/id
|
||||
|
||||
/datum/element/simple_network/Attach(datum/target, id)
|
||||
. = ..()
|
||||
if(. & ELEMENT_INCOMPATIBLE)
|
||||
return
|
||||
src.id = id
|
||||
if(SSsimple_networks.simple_network_lookup[id])
|
||||
SSsimple_networks.simple_network_lookup[id] |= target
|
||||
else
|
||||
SSsimple_networks.simple_network_lookup[id] = list(target)
|
||||
|
||||
/datum/element/simple_network/Detach(datum/source)
|
||||
SSsimple_networks.simple_network_lookup[id] -= source
|
||||
if(!length(SSsimple_networks.simple_network_lookup[id]))
|
||||
SSsimple_networks.simple_network_lookup -= id
|
||||
return ..()
|
||||
@@ -373,7 +373,7 @@ SUBSYSTEM_DEF(zcopy)
|
||||
var/atom/movable/openspace/turf_mimic/DC = T.below.mimic_above_copy
|
||||
DC.appearance = T.below
|
||||
DC.mouse_opacity = initial(DC.mouse_opacity)
|
||||
DC.plane = OPENTURF_MAX_PLANE - turf_depth - 1
|
||||
DC.plane = OPENTURF_MAX_PLANE
|
||||
|
||||
else if (T.below.mimic_above_copy)
|
||||
QDEL_NULL(T.below.mimic_above_copy)
|
||||
@@ -555,7 +555,8 @@ SUBSYSTEM_DEF(zcopy)
|
||||
if (/atom/movable/openspace/turf_proxy, /atom/movable/openspace/turf_mimic)
|
||||
OO.depth += 1
|
||||
if (/atom/movable/openspace/multiplier)
|
||||
OO.depth += 1
|
||||
// Ignore override depth for these.
|
||||
OO.depth = min(zlev_maximums[OO.z] - original_z + 1, OPENTURF_MAX_DEPTH)
|
||||
|
||||
OO.mimiced_type = original_type
|
||||
OO.override_depth = override_depth
|
||||
@@ -803,7 +804,7 @@ var/list/zmimic_fixed_planes = list(
|
||||
for (var/atom/movable/openspace/O in T)
|
||||
found_oo += O
|
||||
|
||||
if (T.shadower.overlays.len)
|
||||
if (T.shadower?.overlays.len)
|
||||
for (var/overlay in T.shadower.overlays)
|
||||
var/atom/movable/openspace/debug/D = new
|
||||
D.appearance = overlay
|
||||
@@ -863,7 +864,7 @@ var/list/zmimic_fixed_planes = list(
|
||||
/datum/controller/subsystem/zcopy/proc/debug_fmt_thing(atom/A, list/out, turf/original)
|
||||
if (istype(A, /atom/movable/openspace/mimic))
|
||||
var/atom/movable/openspace/mimic/OO = A
|
||||
var/base = "<li>[fmt_label("Mimic", A)] plane [A.plane], layer [A.layer], depth [FMT_DEPTH(OO.depth)]"
|
||||
var/base = "<li>[fmt_label("Mimic", A)] plane [A.plane], layer [A.layer], depth [FMT_DEPTH(OO.depth)], override depth [FMT_DEPTH(OO.override_depth)]"
|
||||
if (QDELETED(OO.associated_atom)) // This shouldn't happen, but can if the deletion hook is not working.
|
||||
return "[base] - [OO.type] copying <unknown> ([OO.mimiced_type]) - <font color='red'>ORPHANED</font></em></li>"
|
||||
|
||||
|
||||
@@ -108,8 +108,18 @@
|
||||
|
||||
//* Item Hooks *//
|
||||
|
||||
/**
|
||||
* Called when wielded via wielding component.
|
||||
*
|
||||
* * This is a default hook that's always executed, even if there's a callback provided to the component.
|
||||
*/
|
||||
/obj/item/proc/on_wield(mob/user, hands)
|
||||
return
|
||||
|
||||
/**
|
||||
* Called when wielded via wielding component.
|
||||
*
|
||||
* * This is a default hook that's always executed, even if there's a callback provided to the component.
|
||||
*/
|
||||
/obj/item/proc/on_unwield(mob/user, hands)
|
||||
return
|
||||
|
||||
@@ -158,3 +158,6 @@
|
||||
question = "A cursed blade has been discovered by a curious explorer. \
|
||||
Would you like to play as the soul imprisoned within?"
|
||||
cutoff_number = 1
|
||||
|
||||
/datum/ghost_query/admin
|
||||
wait_time = 10 SECONDS
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
glasses = /obj/item/clothing/glasses/thermal/plain/eyepatch
|
||||
mask = /obj/item/clothing/mask/smokable/cigarette/cigar/havana
|
||||
head = /obj/item/clothing/head/beret //deathsquad
|
||||
belt = /obj/item/gun/energy/pulse_carbine
|
||||
belt = /obj/item/gun/energy/nt_pulse/carbine
|
||||
back = /obj/item/storage/backpack/satchel
|
||||
shoes = /obj/item/clothing/shoes/boots/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
head = /obj/item/clothing/head/helmet/thunderdome
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
l_hand = /obj/item/material/knife
|
||||
r_hand = /obj/item/gun/energy/pulse_rifle
|
||||
r_hand = /obj/item/gun/energy/nt_pulse/rifle
|
||||
r_pocket = /obj/item/grenade/smokebomb
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
var/global/datum/repository/ammomaterial/ammo_repository = new()
|
||||
|
||||
/datum/repository/ammomaterial
|
||||
var/list/ammotypes
|
||||
|
||||
/datum/repository/ammomaterial/New()
|
||||
ammotypes = list()
|
||||
..()
|
||||
|
||||
/datum/repository/ammomaterial/proc/get_materials_from_object(obj/item/ammo_casing/I)
|
||||
|
||||
if(!(I in ammotypes))
|
||||
ammotypes += I
|
||||
var/obj/item/ammo_casing/temp = new I
|
||||
ammotypes[I] = temp.materials_base
|
||||
qdel(temp)
|
||||
|
||||
return ammotypes[I]
|
||||
@@ -47,7 +47,7 @@ var/datum/antagonist/deathsquad/deathsquad
|
||||
else
|
||||
player.equip_to_slot_or_del(new /obj/item/plastique(player), SLOT_ID_LEFT_POCKET)
|
||||
player.equip_to_slot_or_del(new /obj/item/gun/ballistic/revolver/combat(player), SLOT_ID_BELT)
|
||||
player.equip_to_slot_or_del(new /obj/item/gun/energy/pulse_rifle(player), /datum/inventory_slot/abstract/hand/right)
|
||||
player.equip_to_slot_or_del(new /obj/item/gun/energy/nt_pulse/rifle(player), /datum/inventory_slot/abstract/hand/right)
|
||||
player.equip_to_slot_or_del(new /obj/item/hardsuit/ert/assetprotection(player), SLOT_ID_BACK)
|
||||
player.equip_to_slot_or_del(new /obj/item/melee/transforming/energy/sword(player), SLOT_ID_SUIT_STORAGE)
|
||||
// player.implant_loyalty()
|
||||
|
||||
146
code/game/area/victory_areas.dm
Normal file
@@ -0,0 +1,146 @@
|
||||
/** Victory Hallways
|
||||
*/
|
||||
|
||||
/** Deck 4
|
||||
*/
|
||||
/area/victory/hallway/d4aftmaint
|
||||
name = "\improper Deck 4 Aft Maintenance"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/victory/hallway/d4fwdmaint
|
||||
name = "\improper Deck 4 Forward Maintenance"
|
||||
icon_state = "fmaint"
|
||||
|
||||
/area/victory/hallway/d4fwdhall
|
||||
name = "\improper Deck 4 Forward Hallway"
|
||||
icon_state = "hallF"
|
||||
|
||||
/area/victory/hallway/d4afthall
|
||||
name = "\improper Deck 4 Aft Hallway"
|
||||
icon_state = "hallA"
|
||||
|
||||
/area/victory/hallway/d4porthall
|
||||
name = "\improper Deck 4 Port Hallway"
|
||||
icon_state = "hallP"
|
||||
|
||||
/area/victory/hallway/d4starboardhall
|
||||
name = "\improper Deck 4 Starboard Hallway"
|
||||
icon_state = "hallS"
|
||||
|
||||
/** Deck 3
|
||||
*/
|
||||
/area/victory/hallway/d3aftmaint
|
||||
name = "\improper Deck 3 Aft Maintenance"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/victory/hallway/d3fwdmaint
|
||||
name = "\improper Deck 3 Forward Maintenance"
|
||||
icon_state = "fmaint"
|
||||
|
||||
/area/victory/hallway/d3fwdhall
|
||||
name = "\improper Deck 3 Forward Hallway"
|
||||
icon_state = "hallF"
|
||||
|
||||
/area/victory/hallway/d3afthall
|
||||
name = "\improper Deck 3 Aft Hallway"
|
||||
icon_state = "hallA"
|
||||
|
||||
/area/victory/hallway/d3porthall
|
||||
name = "\improper Deck 3 Port Hallway"
|
||||
icon_state = "hallP"
|
||||
|
||||
/area/victory/hallway/d3starboardhall
|
||||
name = "\improper Deck 3 Starboard Hallway"
|
||||
icon_state = "hallS"
|
||||
|
||||
/** Deck 2
|
||||
*/
|
||||
/area/victory/hallway/d2aftmaint
|
||||
name = "\improper Deck 2 Aft Maintenance"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/victory/hallway/d2fwdmaint
|
||||
name = "\improper Deck 2 Forward Maintenance"
|
||||
icon_state = "fmaint"
|
||||
|
||||
/area/victory/hallway/d2fwdhall
|
||||
name = "\improper Deck 2 Forward Hallway"
|
||||
icon_state = "hallF"
|
||||
|
||||
/area/victory/hallway/d2afthall
|
||||
name = "\improper Deck 2 Aft Hallway"
|
||||
icon_state = "hallA"
|
||||
|
||||
/area/victory/hallway/d2porthall
|
||||
name = "\improper Deck 2 Port Hallway"
|
||||
icon_state = "hallP"
|
||||
|
||||
/area/victory/hallway/d2starboardhall
|
||||
name = "\improper Deck 2 Starboard Hallway"
|
||||
icon_state = "hallS"
|
||||
|
||||
/** Deck 1
|
||||
*/
|
||||
/area/victory/hallway/d1aftmaint
|
||||
name = "\improper Deck 1 Aft Maintenance"
|
||||
icon_state = "amaint"
|
||||
|
||||
/area/victory/hallway/d1fwdmaint
|
||||
name = "\improper Deck 1 Forward Maintenance"
|
||||
icon_state = "fmaint"
|
||||
|
||||
/area/victory/hallway/d1fwdhall
|
||||
name = "\improper Deck 1 Forward Hallway"
|
||||
icon_state = "hallF"
|
||||
|
||||
/area/victory/hallway/d1afthall
|
||||
name = "\improper Deck 1 Aft Hallway"
|
||||
icon_state = "hallA"
|
||||
|
||||
/area/victory/hallway/d1porthall
|
||||
name = "\improper Deck 1 Port Hallway"
|
||||
icon_state = "hallP"
|
||||
|
||||
/area/victory/hallway/d1starboardhall
|
||||
name = "\improper Deck 1 Starboard Hallway"
|
||||
icon_state = "hallS"
|
||||
|
||||
/** Command
|
||||
*/
|
||||
/area/victory/command/turrets
|
||||
name = "\improper Point Defense Systems"
|
||||
icon_state = "bridge"
|
||||
|
||||
/** Science
|
||||
*/
|
||||
/area/rnd/robotics/morgue
|
||||
name = "\improper Robotics Morgue"
|
||||
icon_state = "robotics"
|
||||
|
||||
/** Exploration
|
||||
*/
|
||||
/area/victory/exploration
|
||||
name = "\improper Exploration Department"
|
||||
icon_state = "yellow"
|
||||
holomap_color = HOLOMAP_AREACOLOR_SCIENCE
|
||||
|
||||
/area/victory/exploration/hallway_fore
|
||||
name = "\improper Exploration Fore Hallway"
|
||||
|
||||
/area/victory/exploration/hallway_aft
|
||||
name = "\improper Exploration Aft Hallway"
|
||||
|
||||
/** Medical
|
||||
*/
|
||||
|
||||
/area/medical/virology_fore_access
|
||||
name = "\improper Virology Fore Access"
|
||||
icon_state = "virology"
|
||||
|
||||
/area/medical/virology_aft_access
|
||||
name = "\improper Virology Aft Access"
|
||||
icon_state = "virology"
|
||||
|
||||
/area/medical/oncall_room
|
||||
name = "\improper On-Call Room"
|
||||
icon_state = "medbay"
|
||||
@@ -25,8 +25,6 @@
|
||||
var/pass_flags_self = NONE
|
||||
|
||||
//? Unsorted / Legacy
|
||||
/// Used for changing icon states for different base sprites.
|
||||
var/base_icon_state
|
||||
/// Holder for the last time we have been bumped.
|
||||
var/last_bumped = 0
|
||||
/// The higher the germ level, the more germ on the atom.
|
||||
@@ -151,7 +149,16 @@
|
||||
/// contamination insulation; null defaults to rad_insulation, this is a multiplier. *never* set higher than 1!!
|
||||
var/rad_stickiness = 1
|
||||
|
||||
//? Shieldcalls
|
||||
//* Rendering *//
|
||||
|
||||
/// Used for changing icon states for different base sprites.
|
||||
///
|
||||
/// * Not used directly, but it's a frequent pattern to need to override this
|
||||
/// and we don't want to always force usage of initial(icon_state)
|
||||
var/base_icon_state
|
||||
|
||||
//* Shieldcalls *//
|
||||
|
||||
/// sorted priority list of datums for handling shieldcalls with
|
||||
/// we use this instead of signals so we can enforce priorities
|
||||
/// this is horrifying.
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
/// name
|
||||
var/name = "Unknown Faction"
|
||||
/// public abbreviation; if null, it doesn't have one
|
||||
var/abbreviation
|
||||
/// id - must be unique
|
||||
var/id
|
||||
/// short description blurb
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 silicons *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
/datum/world_faction/corporation
|
||||
abstract_type = /datum/world_faction/corporation
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
desc = "A compressed matter container meant for the Gorlex SHRAPNEL-SPITTER SMG. Contains a phoron alloy that self-oxidzes and ignites on contact with air. \n \nThey're in good shape for the shape they're in, \nbut God, I wonder how they think they can win, \nwith phoron rolling down their skin."
|
||||
ammo_max = 40
|
||||
ammo_caliber = /datum/ammo_caliber/phoron_shrap
|
||||
ammo_type = /obj/item/ammo_casing/phoron_shrap
|
||||
ammo_preload = /obj/item/ammo_casing/phoron_shrap
|
||||
|
||||
icon = 'icons/content/factions/corporations/gorlex/items/guns/phoron_spitter.dmi'
|
||||
icon_state = "mag-1"
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
/datum/world_faction/corporation/hephaestus
|
||||
name = "Hephaestus Industries"
|
||||
abbreviation = "HI"
|
||||
id = "hephaestus"
|
||||
desc = "Hephaestus Industries, the premiere Trans-Stellar Corporation for, as their name implies, \
|
||||
industrial and manufacturing needs - as well as their prestigious lines of synthetics often seen serving \
|
||||
on many a Frontier locale. Outside of their affinity towards Nanotrasen and Vey-Med, however, they are still at their core \
|
||||
a corporation built on cut-throat industrialism, often providing the supplies and the technologies of war utilized in many Frontier conflicts. \
|
||||
Nowadays, Hephaestus continues to be a reliable source of industrial supply, albeit tending to be rather dated at times \
|
||||
due to their relative lack of adaptation."
|
||||
|
||||
location_ids = list(
|
||||
/datum/world_location/frontier::id,
|
||||
)
|
||||
@@ -0,0 +1,28 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
// todo: while this is all valid code, this file is commented out because the current weapon racking/pumping/chamber charging system is not good enough to support this.
|
||||
|
||||
/**
|
||||
* * Uses restricted NT-protomag antimaterial caliber.
|
||||
* * Single-shot.
|
||||
* * Extremely powerful. Non-acquirable by most means.
|
||||
* * Synchronous Slide Charging is inbuilt and non-replaceable.
|
||||
*/
|
||||
/obj/item/gun/ballistic/magnetic/nt_protomag/srp
|
||||
name = "anti-material rifle"
|
||||
desc = "A devastating single-shot rifle. Fires ferromagnetic slugs using a bank of internal supercapacitors."
|
||||
description_fluff = {"
|
||||
A monstrously powerful rifle made during the peak of the Phoron War, the Hephaestus Industries
|
||||
"SRP" anti-material rifle was made to counter the development of personal exosuits as well as the
|
||||
looming proliferation of heavy combat synthetics. As potent as it is unwieldly, the recoil generated
|
||||
by this rifle is enough to fracture bone and dent a domestic synthetic's chassis - restricting its
|
||||
use to the few combat androids sturdy enough to use it in sustained fire. The line was discontinued
|
||||
by treaty after the War, with few surviving prototypes able to be found here and there around the Frontier.
|
||||
While technically developed in part with the 'Nanotrasen Protomag' series of prototype mag-charged
|
||||
weapons, this rifle was ultimately abandoned entirely by Nanotrasen due to the existence of their
|
||||
existing pulse weapons, given the similar penetration of pulse weapons despite having a fraction
|
||||
of the recoil.
|
||||
"}
|
||||
|
||||
#warn impl all
|
||||
@@ -0,0 +1,98 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* Caliber *//
|
||||
|
||||
/datum/ammo_caliber/nt_expedition/antimaterial
|
||||
caliber = "nt-antimaterial"
|
||||
diameter = 12
|
||||
length = 92
|
||||
|
||||
//* Ammo Casings *//
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/antimaterial
|
||||
name = "ammo casing (NT-12.5-antimaterial)"
|
||||
desc = "A standardized 12.5x92mm cartridge for NT Expeditionary kinetics. This one seems ridiculously large, and is probably for a very powerful weapon."
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/antimaterial-ammo.dmi'
|
||||
icon_state = "basic"
|
||||
icon_spent = TRUE
|
||||
caliber = /datum/ammo_caliber/nt_expedition/antimaterial
|
||||
projectile_type = /obj/projectile/bullet/nt_expedition/antimaterial
|
||||
|
||||
/// specifically for /obj/item/ammo_magazine/nt_expedition/antimaterial's
|
||||
///
|
||||
/// * null to default to "[base_icon_state || initial(icon_state)]"
|
||||
var/magazine_state
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/antimaterial/penetrator
|
||||
icon_state = "penetrator"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/antimaterial/emp
|
||||
icon_state = "emp"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/antimaterial/explosive
|
||||
icon_state = "explosive"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/antimaterial/titanium
|
||||
icon_state = "titanium"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
//* Magazines *//
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/antimaterial
|
||||
name = "ammo magazine (NT-12.5-antimaterial)"
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/antimaterial-ammo.dmi'
|
||||
icon_state = "magazine"
|
||||
base_icon_state = "magazine"
|
||||
ammo_caliber = /datum/ammo_caliber/nt_expedition/antimaterial
|
||||
ammo_max = 5
|
||||
ammo_preload = /obj/item/ammo_casing/nt_expedition/antimaterial
|
||||
magazine_type = MAGAZINE_TYPE_NORMAL
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/antimaterial/update_icon(updates)
|
||||
cut_overlays()
|
||||
. = ..()
|
||||
var/list/overlays_to_add = list()
|
||||
for(var/i in 1 to min(5, amount_remaining()))
|
||||
var/obj/item/ammo_casing/nt_expedition/antimaterial/casted_path_of_potential = peek_path_of_position(i)
|
||||
var/append = "basic"
|
||||
if(ispath(casted_path_of_potential, /obj/item/ammo_casing/nt_expedition/antimaterial))
|
||||
append = initial(casted_path_of_potential.magazine_state)
|
||||
var/image/overlay = image(icon, "magazine-[append]")
|
||||
overlay.pixel_x = (i - 1) * -2
|
||||
overlay.pixel_y = (i - 1) * 2
|
||||
overlays_to_add += overlay
|
||||
add_overlay(overlays_to_add)
|
||||
|
||||
//* Projectiles *//
|
||||
|
||||
/obj/projectile/bullet/nt_expedition/antimaterial
|
||||
name = "antimaterial sabot"
|
||||
damage_force = 55
|
||||
damage_tier = LERP(BULLET_TIER_HIGH, BULLET_TIER_EXTREME, 1)
|
||||
armor_penetration = 75
|
||||
|
||||
//* Antimaterial Weapons *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/antimaterial
|
||||
abstract_type = /obj/item/gun/ballistic/nt_expedition/antimaterial
|
||||
caliber = /datum/ammo_caliber/nt_expedition/antimaterial
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/antimaterial.dmi'
|
||||
|
||||
// todo: placeholder sprite
|
||||
/obj/item/gun/ballistic/nt_expedition/antimaterial/singleshot
|
||||
name = "anti-material rifle"
|
||||
desc = "The XNR Mk.11 \"Immobilizer\" anti-material rifle; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
A chemical-propelled knockoff of a prototype Hephaestus Industries anti-armour rifle from the days of the Phoron Wars,
|
||||
the XNR Mk.11 "Immobilizer" is an accurate, long-range weapon intended for use on lighter mecha. Unfortunately, its performance
|
||||
suffers against heavier armor due to the limitations of using traditional ammunition in such a 'portable' package.
|
||||
Regardless, its relative ease of handling (and noted ability to be used by an unaugmented soldier) keeps it in the armories of some
|
||||
corporate militaries and emergency responders.
|
||||
"} + "<br>"
|
||||
icon_state = "rifle"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
@@ -0,0 +1,161 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* Caliber *//
|
||||
|
||||
/datum/ammo_caliber/nt_expedition/heavy_rifle
|
||||
caliber = "nt-heavy-rifle"
|
||||
diameter = 7.5
|
||||
length = 54
|
||||
|
||||
//* Ammo Casings *//
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/heavy_rifle
|
||||
name = "ammo casing (NT-7.5-LR)"
|
||||
desc = "A standardized 7.5x54mm cartridge for NT Expeditionary kinetics. This one seems to be for heavy rifles."
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/rifle-heavy-ammo.dmi'
|
||||
icon_state = "basic"
|
||||
icon_spent = TRUE
|
||||
caliber = /datum/ammo_caliber/nt_expedition/heavy_rifle
|
||||
projectile_type = /obj/projectile/bullet/nt_expedition/heavy_rifle
|
||||
|
||||
/// specifically for /obj/item/ammo_magazine/nt_expedition/heavy_rifle's
|
||||
var/stripper_state = "basic"
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/heavy_rifle/piercing
|
||||
icon_state = "piercing"
|
||||
stripper_state = "piercing"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/heavy_rifle/rubber
|
||||
icon_state = "rubber"
|
||||
stripper_state = "rubber"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
//* Magazines *//
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_rifle
|
||||
name = "ammo magazine (NT-7.5-LR)"
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/rifle-heavy-ammo.dmi'
|
||||
ammo_caliber = /datum/ammo_caliber/nt_expedition/heavy_rifle
|
||||
ammo_preload = /obj/item/ammo_casing/nt_expedition/heavy_rifle
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_rifle/stripper_clip
|
||||
name = "stripper clip (NT-7.5-LR)"
|
||||
icon_state = "stripper"
|
||||
base_icon_state = "stripper"
|
||||
ammo_max = 6
|
||||
magazine_type = MAGAZINE_TYPE_CLIP
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_rifle/stripper_clip/update_icon(updates)
|
||||
cut_overlays()
|
||||
. = ..()
|
||||
var/list/overlays_to_add = list()
|
||||
for(var/i in 1 to min(5, amount_remaining()))
|
||||
var/obj/item/ammo_casing/nt_expedition/heavy_rifle/casted_path_of_potential = peek_path_of_position(i)
|
||||
var/append = "basic"
|
||||
if(ispath(casted_path_of_potential, /obj/item/ammo_casing/nt_expedition/heavy_rifle))
|
||||
append = initial(casted_path_of_potential.stripper_state)
|
||||
var/image/overlay = image(icon, "stripper-[append]")
|
||||
overlay.pixel_x = (i - 1) * -2 - 8
|
||||
overlay.pixel_y = (i - 1) * 2 - 8
|
||||
overlays_to_add += overlay
|
||||
add_overlay(overlays_to_add)
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_rifle/stick
|
||||
name = "ammo magazine (NT-7.5-LR)"
|
||||
icon_state = "mag-basic-0"
|
||||
base_icon_state = "mag-basic"
|
||||
magazine_type = MAGAZINE_TYPE_NORMAL
|
||||
ammo_max = 16
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_rifle/stick/extended
|
||||
name = "extended magazine (NT-7.5-LR)"
|
||||
icon_state = "mag-ext-basic-0"
|
||||
base_icon_state = "mag-ext-basic"
|
||||
ammo_max = 24
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_rifle/stick/drum
|
||||
name = "drum magazine (NT-7.5-LR)"
|
||||
icon_state = "mag-drum-basic-0"
|
||||
base_icon_state = "mag-drum-basic"
|
||||
ammo_max = 40
|
||||
|
||||
//* Projectiles *//
|
||||
|
||||
/obj/projectile/bullet/nt_expedition/heavy_rifle
|
||||
name = "heavy rifle bullet"
|
||||
damage_force = 40
|
||||
damage_tier = LERP(BULLET_TIER_MEDIUM, BULLET_TIER_HIGH, 1)
|
||||
armor_penetration = 50
|
||||
|
||||
//* Heavy Rifles *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_rifle
|
||||
abstract_type = /obj/item/gun/ballistic/nt_expedition/heavy_rifle
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/rifle-heavy.dmi'
|
||||
caliber = /datum/ammo_caliber/nt_expedition/heavy_rifle
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_rifle/singleshot
|
||||
name = "marksman rifle"
|
||||
desc = "The XNR(S) Mk.10 \"Old Man\" marksman rifle; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
A single shot, break action rifle chambered in 7.5x54mm, and sporting a 2x magnified optic,
|
||||
this is the go-to hunting rifle for long-range patrols.
|
||||
Light, uncomplicated, and rugged, the “Old Man” has nothing fancy about it.
|
||||
But, time and again, it works, day in, and day out.
|
||||
"} + "<br>"
|
||||
icon_state = "single"
|
||||
base_icon_state = "single"
|
||||
item_renderer = /datum/gun_item_renderer/empty_state
|
||||
load_method = SINGLE_CASING | SPEEDLOADER
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_rifle/semirifle
|
||||
name = "heavy rifle"
|
||||
desc = "The XNR Mk.9 \"Ranger\" heavy rifle; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
Using the Mk.4 “Scout” as a baseline, this semiautomatic rifle is akin to holding a monster,
|
||||
disguised in the skin of a dearly beloved friend in your hands.
|
||||
Using full-powered rifle rounds (7.5x54mm), this rifle is broken out when you absolutely
|
||||
positively have to blow a fist-sized hole in something and don't have time to wait.
|
||||
A scaled-up version of the Scout, with box magazines, this long gun is often seen issued
|
||||
to hunters looking to take down game to sustain an expedition.
|
||||
"} + "<br>"
|
||||
icon_state = "semi"
|
||||
base_icon_state = "semi"
|
||||
item_renderer = /datum/gun_item_renderer/empty_state
|
||||
load_method = MAGAZINE | SINGLE_CASING
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_rifle/autorifle
|
||||
name = "heavy automatic rifle"
|
||||
desc = "The XNR MK.9 Mod.1 \"Auto Ranger\" heavy rifle; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
“What if we just.. Put a bigger magazine in it and a full auto trigger pack?” is the
|
||||
question that led to the development of the “Auto Ranger”, at first.
|
||||
Then, after an 'eventful' initial test, a gyroscopic stabilizer was added below
|
||||
the handguard and a fixed stock was installed to handle the 'roller coaster' as one test
|
||||
participant described the experience. Limiting the rifle
|
||||
to burst fire keeps the rifle on target through most situations.
|
||||
"} + "<br>"
|
||||
icon_state = "auto-map"
|
||||
base_icon_state = "auto"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
load_method = MAGAZINE | SINGLE_CASING
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_rifle/lmg
|
||||
name = "light machine gun"
|
||||
desc = "The XNR Mk.9 Mod.2 \"Hailmaker\" light machine gun; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
The tests of the Mod.2 design quickly turned development towards a
|
||||
general purpose machine gun (GPMG) version of the Ranger series, the “Hailmaker.”.
|
||||
Sporting a frame-mounted cryo-stabilized heavy barrel, a feed tray for quickly reloading
|
||||
via an assistant gunner, a belt box for 100 rounds of 7.5x54mm, and a gyroscopic assist system,
|
||||
this weapon is seen in the guard towers of base camps and atop vehicles in addition to
|
||||
dedicated machine gun teams. The patter this weapon makes as it suppresses any hostile
|
||||
force makes this weapon's name a logical choice.
|
||||
"} + "<br>"
|
||||
icon_state = "lmg"
|
||||
load_method = MAGAZINE | SINGLE_CASING
|
||||
|
||||
// todo: rendering; how are we going to render both unloaded and open?
|
||||
// todo: rendering; maybe expand the render additional to allow for generation of a list?
|
||||
@@ -0,0 +1,135 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* Caliber *//
|
||||
|
||||
/datum/ammo_caliber/nt_expedition/heavy_sidearm
|
||||
caliber = "nt-heavy-sidearm"
|
||||
diameter = 9
|
||||
length = 34
|
||||
|
||||
//* Ammo Casings *//
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/heavy_sidearm
|
||||
name = "ammo casing (NT-9-magnum)"
|
||||
desc = "A standardized 9mm cartridge for NT Expeditionary kinetics. This one seems to be for heavy-duty sidearms."
|
||||
caliber = /datum/ammo_caliber/nt_expedition/heavy_sidearm
|
||||
projectile_type = /obj/projectile/bullet/nt_expedition/heavy_sidearm
|
||||
|
||||
/// specifically for /obj/item/ammo_magazine/nt_expedition/heavy_rifle's
|
||||
var/speedloader_state = "basic"
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/heavy_sidearm/piercing
|
||||
icon_state = "piercing"
|
||||
speedloader_state = "piercing"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/heavy_sidearm/rubber
|
||||
icon_state = "rubber"
|
||||
speedloader_state = "rubber"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
//* Magazines *//
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_sidearm
|
||||
name = "ammo magazine (NT-9-LR)"
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/sidearm-heavy-ammo.dmi'
|
||||
rendering_system = GUN_RENDERING_DISABLED
|
||||
ammo_caliber = /datum/ammo_caliber/nt_expedition/heavy_sidearm
|
||||
ammo_max = 5
|
||||
ammo_preload = /obj/item/ammo_casing/nt_expedition/heavy_sidearm
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_sidearm/speedloader
|
||||
name = "speedloader (NT-9-LR)"
|
||||
icon_state = "speedloader"
|
||||
base_icon_state = "speedloader"
|
||||
magazine_type = MAGAZINE_TYPE_SPEEDLOADER
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_sidearm/speedloader/update_icon(updates)
|
||||
cut_overlays()
|
||||
. = ..()
|
||||
var/list/overlays_to_add = list()
|
||||
for(var/i in 1 to min(4, amount_remaining()))
|
||||
var/obj/item/ammo_casing/nt_expedition/heavy_sidearm/predicted_path = peek_path_of_position(i)
|
||||
var/append = "basic"
|
||||
if(ispath(predicted_path, /obj/item/ammo_casing/nt_expedition/heavy_sidearm))
|
||||
append = initial(predicted_path.speedloader_state)
|
||||
var/image/overlay = image(icon, "speedloader-[append]")
|
||||
overlay.pixel_x = (i - 1) * 2 - 1
|
||||
overlay.pixel_y = (i - 1) * -2 + 1
|
||||
overlays_to_add += overlay
|
||||
add_overlay(overlays_to_add)
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_sidearm/pistol
|
||||
name = "pistol magazine (NT-9-LR)"
|
||||
icon_state = "magazine-5"
|
||||
base_icon_state = "magazine"
|
||||
rendering_static_overlay = "magazine-stripe"
|
||||
magazine_type = MAGAZINE_TYPE_NORMAL
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/heavy_sidearm/smg
|
||||
name = "smg magazine (NT-9-LR)"
|
||||
icon_state = "smg-1"
|
||||
base_icon_state = "smg"
|
||||
rendering_static_overlay = "smg-stripe"
|
||||
magazine_type = MAGAZINE_TYPE_NORMAL
|
||||
|
||||
//* Projectiles *//
|
||||
|
||||
/obj/projectile/bullet/nt_expedition/heavy_sidearm
|
||||
name = "heavy bullet"
|
||||
damage_force = 35
|
||||
damage_tier = LERP(BULLET_TIER_LOW, BULLET_TIER_MEDIUM, 0.95)
|
||||
armor_penetration = 20
|
||||
|
||||
//* Heavy Sidearms *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_sidearm
|
||||
abstract_type = /obj/item/gun/ballistic/nt_expedition/heavy_sidearm
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/sidearm-heavy.dmi'
|
||||
caliber = /datum/ammo_caliber/nt_expedition/heavy_sidearm
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_sidearm/pistol
|
||||
name = "heavy pistol"
|
||||
desc = "The XNP Mk.2 \"Angry Moth\" sidearm; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
Taking the original XNP Mk.1 to the next level, this time upscaling the frame to accept a
|
||||
magnum 9x34mm cartridge, the “Angry Moth” sidearm is best described
|
||||
as “Shaking hands with danger”. The recoil it imparts will make it hard to forget
|
||||
the experience, but the performance on target leaves little to complain about.
|
||||
Feeding from medium-sized magazines, this full-sized service pistol is seen when
|
||||
fighting is expected and not simply a possibility.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "pistol-map"
|
||||
base_icon_state = "pistol"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_sidearm/revolver
|
||||
name = "heavy revolver"
|
||||
desc = "The XNP Mk.5 \"Roller\" revolver; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
Something of a pet project of one member of the XN design team, the “Roller” harkens back
|
||||
to the revolvers of old, but chambered in the magnum 9x34mm cartridge.
|
||||
Sporting a medium-capacity cylinder and an inline barrel design to reduce muzzle flip,
|
||||
this weapon is seen in the hands of those who prefer style over functionality or want
|
||||
the fine trigger control a triple-action revolver provides.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | SPEEDLOADER
|
||||
icon_state = "revolver"
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/heavy_sidearm/smg
|
||||
name = "submachine gun"
|
||||
desc = "The XNMP Mk.8 \"Buzzsaw\" submachine gun; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
Taking design notes from the Mk.3 “Buzzer, the “Buzzsaw” sports a longer barrel,
|
||||
a thicker receiver, and a folding stock typically seen on rifles.
|
||||
Using the magnum 9x34mm round in long-form magazines, the “Buzzsaw”'s high rate of fire and
|
||||
punchy ammunition makes its unique sound hard to mistake when seen clearing rooms or
|
||||
in dense jungle foliage, where the high-velocity rounds batter aside light cover
|
||||
with relative ease.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "smg-map"
|
||||
base_icon_state = "smg"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
@@ -0,0 +1,201 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* Caliber *//
|
||||
|
||||
/datum/ammo_caliber/nt_expedition/light_rifle
|
||||
caliber = "nt-light-rifle"
|
||||
diameter = 7.5
|
||||
length = 39
|
||||
|
||||
//* Ammo Casings *//
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/light_rifle
|
||||
name = "ammo casing (NT-7.5-SR)"
|
||||
desc = "A standardized 7.5x39mm cartridge for NT Expeditionary kinetics. This one seems to be for lightweight automatics."
|
||||
caliber = /datum/ammo_caliber/nt_expedition/light_rifle
|
||||
projectile_type = /obj/projectile/bullet/nt_expedition/light_rifle
|
||||
icon_state = "basic"
|
||||
|
||||
/// specifically for /obj/item/ammo_magazine/nt_expedition/light_rifle's
|
||||
var/speedloader_state = "basic"
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/light_rifle/piercing
|
||||
icon_state = "piercing"
|
||||
speedloader_state = "piercing"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/light_rifle/rubber
|
||||
icon_state = "rubber"
|
||||
speedloader_state = "rubber"
|
||||
// todo: implement casing + magazine
|
||||
|
||||
//* Magazines *//
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_rifle
|
||||
name = "ammo magazine (NT-7.5)"
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/rifle-light-ammo.dmi'
|
||||
icon_state = "magazine"
|
||||
base_icon_state = "magazine"
|
||||
rendering_system = GUN_RENDERING_DISABLED
|
||||
ammo_caliber = /datum/ammo_caliber/nt_expedition/light_rifle
|
||||
ammo_max = 5
|
||||
ammo_preload = /obj/item/ammo_casing/nt_expedition/light_rifle
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_rifle/speedloader
|
||||
name = "speedloader (NT-7.5)"
|
||||
icon_state = "speedloader"
|
||||
base_icon_state = "speedloader"
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_rifle/speedloader/update_icon(updates)
|
||||
cut_overlays()
|
||||
. = ..()
|
||||
var/list/overlays_to_add = list()
|
||||
var/static/list/pos_x = list(
|
||||
2,
|
||||
4,
|
||||
6,
|
||||
1,
|
||||
2,
|
||||
4,
|
||||
)
|
||||
var/static/list/pos_y = list(
|
||||
-2,
|
||||
-4,
|
||||
-6,
|
||||
-1,
|
||||
-2,
|
||||
-4
|
||||
)
|
||||
for(var/i in 1 to min(6, amount_remaining()))
|
||||
var/obj/item/ammo_casing/nt_expedition/light_rifle/predicted_path = peek_path_of_position(i)
|
||||
var/append = "basic"
|
||||
if(ispath(predicted_path, /obj/item/ammo_casing/nt_expedition/light_rifle))
|
||||
append = initial(predicted_path.speedloader_state)
|
||||
var/image/overlay = image(icon, "speedloader-[append]")
|
||||
overlay.pixel_x = pos_x[i]
|
||||
overlay.pixel_y = pos_y[i]
|
||||
overlays_to_add += overlay
|
||||
add_overlay(overlays_to_add)
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_rifle/stick
|
||||
name = "ammo magazine (NT-7.5)"
|
||||
icon_state = "rifle-1"
|
||||
base_icon_state = "rifle"
|
||||
rendering_system = GUN_RENDERING_STATES
|
||||
rendering_count = 1
|
||||
rendering_static_overlay = "rifle-stripe"
|
||||
ammo_max = 16
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_rifle/stick/extended
|
||||
name = "extended magazine (NT-7.5)"
|
||||
icon_state = "rifle-ext-1"
|
||||
base_icon_state = "rifle-ext"
|
||||
rendering_system = GUN_RENDERING_STATES
|
||||
rendering_count = 1
|
||||
rendering_static_overlay = "rifle-ext-stripe"
|
||||
ammo_max = 24
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_rifle/stick/drum
|
||||
name = "drum magazine (NT-7.5)"
|
||||
icon_state = "rifle-drum-1"
|
||||
base_icon_state = "rifle-drum"
|
||||
rendering_system = GUN_RENDERING_STATES
|
||||
rendering_count = 1
|
||||
rendering_static_overlay = "rifle-drum-stripe"
|
||||
ammo_max = 40
|
||||
|
||||
//* Projectiles *//
|
||||
|
||||
/obj/projectile/bullet/nt_expedition/light_rifle
|
||||
name = "rifle bullet"
|
||||
damage_force = 35
|
||||
damage_tier = LERP(BULLET_TIER_MEDIUM, BULLET_TIER_HIGH, 0.5)
|
||||
armor_penetration = 35
|
||||
|
||||
//* Light Rifles *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_rifle
|
||||
abstract_type = /obj/item/gun/ballistic/nt_expedition/light_rifle
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/rifle-light.dmi'
|
||||
caliber = /datum/ammo_caliber/nt_expedition/light_rifle
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_rifle/pistol
|
||||
name = "high-caliber pistol"
|
||||
desc = "The XNP Mk.9 \"David\" revolver; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
An oddball of a revolver, the Mark 9 was made as little more than a proof of concept.
|
||||
Chambering 7.5x39mm light rifle ammunition, the "David" sidearm is capable of consistently,
|
||||
and accurately (for its uncanny size) punching above its paygrade.
|
||||
Unfortunately, the downsides of using such a heavy caliber in a sidearm package limits its
|
||||
practical use. This is nonetheless seen now and then in the hands of enthusiasts.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | SPEEDLOADER
|
||||
icon_state = "revolver"
|
||||
base_icon_state = "revolver"
|
||||
render_break_overlay = BALLISTIC_RENDER_BREAK_OPEN
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_rifle/semirifle
|
||||
name = "semi-automatic rifle"
|
||||
desc = "The XNR Mk.4 \"Scout\" light rifle; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
The basis of a new family of carbines developed to make use of 7.5x39mm ammunition,
|
||||
the “Scout is a traditional pattern of semi-automatic rifle with a mid-length barrel and
|
||||
adjustable stock, using a short stroke gas piston to cycle the action.
|
||||
The basic design is fitted with a zero magnification optic and comes packaged with
|
||||
relatively compact magazines. However, larger magazines will also work with this
|
||||
workhorse of a weapon.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "semi-map"
|
||||
base_icon_state = "semi"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_rifle/autorifle
|
||||
name = "automatic rifle"
|
||||
desc = "The XNR Mk.4 Mod.1 \"Auto Scout\" light rifle; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
The first modification of the Mk.4 carbine, the “Auto Scout” is the next logical step
|
||||
of the platform by adding an automatic fire control group. Still using the same short-stroke
|
||||
gas piston and featuring a compensator on the end to help control recoil,
|
||||
this rifle still sports a zero-magnification optic and adds a short vertical grip as
|
||||
standard to the forward handguard. Issued with larger magazines to make better use of
|
||||
the automatic fire this weapon is capable of.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "auto-map"
|
||||
base_icon_state = "auto"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_rifle/pdw
|
||||
name = "personal defense weapon"
|
||||
desc = "The XNR Mk.4 Mod.2 \"Little Scout\" personal defense weapon; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
Taking the concept of the original “Scout” and chopping the barrel, this weapon is lighter,
|
||||
more handy, and easier to carry when you need something more than a pistol,
|
||||
but a rifle would interfere with other duties. Sticking to the semi-automatic fire
|
||||
control of the parent, but chopping the barrel and adding the compensator of the Mod.1,
|
||||
this weapon's ability to fold away helps make it easy to package and
|
||||
store inside cramped cockpits and into survival kits with its compact magazines.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "pdw-map"
|
||||
base_icon_state = "pdw"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_rifle/lmg
|
||||
name = "squad automatic weapon"
|
||||
desc = "The XNR Mk.4 Mod.3 \"Machine Scout\" squad automatic weapon; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
The final entry of the “Scout” series, the “Machine Scout” makes use of a heavier barrel,
|
||||
a recoil compensating gyro on the bottom of the handguard,
|
||||
and the option to feed from larger box and drum magazines, this gives a heavy punch to
|
||||
recon teams and security units while keeping a common set of parts
|
||||
to reduce the complexities of servicing and maintaining the series as a whole.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "saw-map"
|
||||
base_icon_state = "saw"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
render_bolt_overlay = BALLISTIC_RENDER_BOLT_CLOSE
|
||||
render_break_overlay = BALLISTIC_RENDER_BREAK_BOTH
|
||||
@@ -0,0 +1,135 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* Caliber *//
|
||||
|
||||
/datum/ammo_caliber/nt_expedition/light_sidearm
|
||||
caliber = "nt-light-sidearm"
|
||||
diameter = 9
|
||||
length = 29
|
||||
|
||||
//* Ammo Casings *//
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition/light_sidearm
|
||||
name = "ammo casing (NT-9)"
|
||||
desc = "A standardized 9mm cartridge for NT Expeditionary kinetics. This one seems to be for lightweight pistols and sidearms."
|
||||
caliber = /datum/ammo_caliber/nt_expedition/light_sidearm
|
||||
projectile_type = /obj/projectile/bullet/nt_expedition/light_sidearm
|
||||
|
||||
/// specifically for /obj/item/ammo_magazine/nt_expedition/light_sidearm's
|
||||
var/speedloader_state = "basic"
|
||||
|
||||
//* Magazines *//
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_sidearm
|
||||
name = "ammo magazine (NT-9)"
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/rifle-heavy-ammo.dmi'
|
||||
icon_state = "magazine"
|
||||
base_icon_state = "magazine"
|
||||
rendering_system = GUN_RENDERING_DISABLED
|
||||
ammo_caliber = /datum/ammo_caliber/nt_expedition/light_sidearm
|
||||
ammo_max = 5
|
||||
ammo_preload = /obj/item/ammo_casing/nt_expedition/light_sidearm
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_sidearm/speedloader
|
||||
icon_state = "speedloader"
|
||||
base_icon_state = "speedloader"
|
||||
ammo_max = 6
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_sidearm/speedloader/update_icon(updates)
|
||||
cut_overlays()
|
||||
. = ..()
|
||||
var/list/overlays_to_add = list()
|
||||
// todo: make this look better, this is the lazy locations.
|
||||
var/static/list/pos_x = list(
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
)
|
||||
var/static/list/pos_y = list(
|
||||
-0,
|
||||
-1,
|
||||
-2,
|
||||
-3,
|
||||
-4,
|
||||
-5,
|
||||
)
|
||||
for(var/i in 1 to min(6, amount_remaining()))
|
||||
var/obj/item/ammo_casing/nt_expedition/light_sidearm/predicted_path = peek_path_of_position(i)
|
||||
var/append = "basic"
|
||||
if(ispath(predicted_path, /obj/item/ammo_casing/nt_expedition/light_sidearm))
|
||||
append = initial(predicted_path.speedloader_state)
|
||||
var/image/overlay = image(icon, "speedloader-[append]")
|
||||
overlay.pixel_x = pos_x[i]
|
||||
overlay.pixel_y = pos_y[i]
|
||||
overlays_to_add += overlay
|
||||
add_overlay(overlays_to_add)
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_sidearm/pistol
|
||||
name = "pistol magazine (NT-9)"
|
||||
icon_state = "pistol-5"
|
||||
base_icon_state = "pistol"
|
||||
rendering_system = GUN_RENDERING_STATES
|
||||
rendering_count = 5
|
||||
rendering_static_overlay = "pistol-stripe"
|
||||
ammo_max = 8
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition/light_sidearm/smg
|
||||
icon_state = "smg-1"
|
||||
base_icon_state = "smg"
|
||||
rendering_system = GUN_RENDERING_STATES
|
||||
rendering_count = 1
|
||||
rendering_static_overlay = "smg-stripe"
|
||||
ammo_max = 24
|
||||
|
||||
//* Projectiles *//
|
||||
|
||||
/obj/projectile/bullet/nt_expedition/light_sidearm
|
||||
name = "bullet"
|
||||
damage_force = 35
|
||||
damage_tier = LERP(BULLET_TIER_LOW, BULLET_TIER_MEDIUM, 0.25)
|
||||
armor_penetration = 10
|
||||
|
||||
//* Light Sidearms *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_sidearm
|
||||
abstract_type = /obj/item/gun/ballistic/nt_expedition/light_sidearm
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/expeditionary/sidearm-light.dmi'
|
||||
caliber = /datum/ammo_caliber/nt_expedition/light_sidearm
|
||||
|
||||
//* Pistol *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_sidearm/pistol
|
||||
name = "light pistol"
|
||||
desc = "The XNP Mk.1 \"Noisy Moth\" pistol; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
A hold-out semiautomatic pistol designed to fit in the pocket and with an easy-to-use
|
||||
system of controls, the “Noisy Moth” is chambered in a lengthened version of the classic 9mm,
|
||||
packing a little more punch than traditional sidearms in this caliber.
|
||||
A small compensator and internal recoil dampeners make the increase in felt recoil negligible,
|
||||
while its magazine gives it enough ammunition for those in a pinch to take chance shots.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "pistol-map"
|
||||
base_icon_state = "pistol"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC
|
||||
|
||||
//* SMG *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/light_sidearm/smg
|
||||
name = "machine pistol"
|
||||
desc = "The XNMP Mk.3 \"Buzzer\" machine pistol; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
A personal defense weapon with collapsing stock, the “Buzzer” is chambered in 9x29mm.
|
||||
A short-barreled weapon easily hung on a belt, and feeding from medium-sized magazines to
|
||||
keep it handy, the simple “Buzzer” does tend to make more sound and fury than an effective
|
||||
combat weapon, but it will certainly raise the alarm when its shrill report sounds in
|
||||
the dead of night.
|
||||
"} + "<br>"
|
||||
load_method = SINGLE_CASING | MAGAZINE
|
||||
icon_state = "smg-map"
|
||||
base_icon_state = "smg"
|
||||
render_magazine_overlay = MAGAZINE_CLASS_GENERIC | MAGAZINE_CLASS_EXTENDED
|
||||
@@ -0,0 +1,67 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
// todo: while this is all valid code, this file is commented out because the current weapon racking/pumping/chamber charging system is not good enough to support this.
|
||||
|
||||
//* Ammo *//
|
||||
|
||||
/obj/item/ammo_magazine/a12g/nt_expedition
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/gun/expeditionary/shotgun-ammo.dmi'
|
||||
|
||||
#warn restrict to NT-expeditionary
|
||||
|
||||
/obj/item/ammo_magazine/a12g/nt_expedition/slide
|
||||
name = "XNS slide magazine (a12g)"
|
||||
|
||||
/obj/item/ammo_magazine/a12g/nt_expedition/box
|
||||
name = "XNS box magazine (12g)"
|
||||
|
||||
#warn slide-mag 0 to 5, box-mag 0 to 1
|
||||
|
||||
//* Shotguns *//
|
||||
|
||||
/obj/item/gun/ballistic/nt_expedition/shotgun
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/gun/expeditionary/shotgun.dmi'
|
||||
caliber = /datum/ammo_caliber/a12g
|
||||
|
||||
//* Pump Shotgun *//
|
||||
|
||||
/**
|
||||
* * Requires pumping.
|
||||
* * Break action magazine load or single load.
|
||||
*/
|
||||
/obj/item/gun/ballistic/nt_expedition/shotgun/pump
|
||||
name = "pump shotgun"
|
||||
desc = "The XNS Mk.6 \"Standby\" pump-action shotgun; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
A pump-action design based on the proven pump-action mechanism developed centuries ago,
|
||||
the XNS Mk.6 or “Standby” is designed around a tube magazine using 12-gauge ammunition.
|
||||
Rugged, if not fancy, this weapon is a good fallback option for anyone
|
||||
requiring access to a long arm when out on their own or in small groups.
|
||||
"} + "<br>"
|
||||
icon_state = "pump"
|
||||
#warn pump-open
|
||||
|
||||
#warn impl
|
||||
|
||||
//* Semi-Automatic Shotgun *//
|
||||
|
||||
/**
|
||||
* * Magazine loaded.
|
||||
* * Semi-automatic.
|
||||
*/
|
||||
/obj/item/gun/ballistic/nt_expedition/shotgun/semiauto
|
||||
name = "semi-automatic shotgun"
|
||||
desc = "The XNS Mk.7 \"Peacemaker\" semi-automatic shotgun; a refined design output by the Nanotrasen Research Division in conjunction with Hephaestus Industries."
|
||||
description_fluff = {"
|
||||
A semiautomatic evolution of the XNS Mk.6, using an internal inertial locking system and
|
||||
muzzle brake. Big, blocky, and using detachable box magazines of 12-gauge ammunition,
|
||||
the barrel tends to get quite warm if fired without pause. A common sight seen with
|
||||
specialist security personnel supporting work crews, the somewhat bulky weapon
|
||||
lives up to its name in helping deter both hostile animals and bandits from
|
||||
thinking they can make an easy score.
|
||||
"} + "<br>"
|
||||
icon_state = "semiauto"
|
||||
#warn semiauto-empty (magout)
|
||||
|
||||
#warn impl
|
||||
@@ -0,0 +1,51 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
//* Caliber *//
|
||||
|
||||
/datum/ammo_caliber/nt_expedition
|
||||
abstract_type = /datum/ammo_caliber/nt_expedition
|
||||
|
||||
//* Ammo Casings *//
|
||||
|
||||
/obj/item/ammo_casing/nt_expedition
|
||||
description_fluff = {"
|
||||
A casing for the experimental lineage of chemical-primed kinetic weaponry developed as part of a joint effort
|
||||
between Hephaestus Industries and the Nanotrasen Research Division. Created both to enhance compatibility as well
|
||||
as well as to improve security on installations operated by the Triumvirate, the 'NT Expeditionary' line boasts an
|
||||
above-average reliability rating, as well as being easy to restock out on the Frontier.
|
||||
"}
|
||||
caliber = /datum/ammo_caliber/nt_expedition
|
||||
|
||||
//* Magazines *//
|
||||
|
||||
/obj/item/ammo_magazine/nt_expedition
|
||||
description_fluff = {"
|
||||
A casing for the experimental lineage of chemical-primed kinetic weaponry developed as part of a joint effort
|
||||
between Hephaestus Industries and the Nanotrasen Research Division. Created both to enhance compatibility as well
|
||||
as well as to improve security on installations operated by the Triumvirate, the 'NT Expeditionary' line boasts an
|
||||
above-average reliability rating, as well as being easy to restock out on the Frontier.
|
||||
"}
|
||||
ammo_caliber = /datum/ammo_caliber/nt_expedition
|
||||
|
||||
//* Projectiles *//
|
||||
|
||||
/obj/projectile/bullet/nt_expedition
|
||||
|
||||
//* Weapons *//
|
||||
|
||||
/**
|
||||
* Naming scheme:
|
||||
*
|
||||
* XN<T> Mk.<V>
|
||||
*
|
||||
* Where 'T' is type, and 'V' is some version.
|
||||
*
|
||||
* e.g. XNS Mk.6 -> T = S for shotgun, prototype 6.
|
||||
*/
|
||||
/obj/item/gun/ballistic/nt_expedition
|
||||
description_fluff_categorizer = {"
|
||||
This weapon is part of the experimental lineage of chemical-primed kinetic weaponry developed as part of a joint effort between Hephaestus Industries and the Nanotrasen Research Division. Created both to enhance compatibility as well as to improve security on installations operated by the Triumvirate, the 'NT Expeditionary' line boasts an above-average reliability rating
|
||||
in addition to being rather simple to restock out on the Frontier.
|
||||
"}
|
||||
render_use_legacy_by_default = FALSE
|
||||
@@ -1,31 +1,34 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 silicons *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
/datum/firemode/energy/pulse_rifle
|
||||
/datum/firemode/energy/nt_pulse/rifle
|
||||
|
||||
/datum/firemode/energy/pulse_rifle/laser
|
||||
/datum/firemode/energy/nt_pulse/rifle/laser
|
||||
name = "laser"
|
||||
render_key = "kill"
|
||||
settings = list(mode_name = "lethal", projectile_type = /obj/projectile/beam, charge_cost = 80)
|
||||
|
||||
/datum/firemode/energy/pulse_rifle/pulse
|
||||
/datum/firemode/energy/nt_pulse/rifle/pulse
|
||||
name = "pulse"
|
||||
render_key = "destroy"
|
||||
settings = list(mode_name = "destroy", projectile_type = /obj/projectile/beam/pulse, charge_cost = 180)
|
||||
|
||||
/datum/firemode/energy/pulse_carbine
|
||||
/datum/firemode/energy/nt_pulse/carbine
|
||||
|
||||
/datum/firemode/energy/pulse_carbine/laser
|
||||
/datum/firemode/energy/nt_pulse/carbine/laser
|
||||
name = "laser"
|
||||
render_key = "kill"
|
||||
settings = list(mode_name = "lethal", projectile_type = /obj/projectile/beam, charge_cost = 120)
|
||||
|
||||
/datum/firemode/energy/pulse_carbine/pulse
|
||||
/datum/firemode/energy/nt_pulse/carbine/pulse
|
||||
name = "pulse"
|
||||
render_key = "destroy"
|
||||
settings = list(mode_name = "destroy", projectile_type = /obj/projectile/beam/pulse, charge_cost = 240)
|
||||
|
||||
/obj/item/gun/energy/pulse_rifle
|
||||
/obj/item/gun/energy/nt_pulse
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/nt_pulse.dmi'
|
||||
|
||||
/obj/item/gun/energy/nt_pulse/rifle
|
||||
name = "pulse rifle"
|
||||
desc = "A powerful energy rifle with multiple intensity selectors."
|
||||
// intentionally the same as all pulse weapons to save memory
|
||||
@@ -34,10 +37,9 @@
|
||||
allowing for a more laminar and cohesive beam than prior thought possible. Closely guarded designs to this day,
|
||||
pulse weapons are some of the only energy-based armaments able to consistently outperform any kinetic alternative.
|
||||
"}
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/pulse.dmi'
|
||||
icon_state = "rifle"
|
||||
base_icon_state = "rifle"
|
||||
render_mob_base = "pulse"
|
||||
base_mob_state = "pulse"
|
||||
slot_flags = SLOT_BACK
|
||||
// todo: firemode this
|
||||
one_handed_penalty = 10
|
||||
@@ -47,8 +49,8 @@
|
||||
fire_delay = 5 // might need to nerf this to 8 later, this is a very powerful weapon.
|
||||
|
||||
firemodes = list(
|
||||
/datum/firemode/energy/pulse_rifle/laser,
|
||||
/datum/firemode/energy/pulse_rifle/pulse,
|
||||
/datum/firemode/energy/nt_pulse/rifle/laser,
|
||||
/datum/firemode/energy/nt_pulse/rifle/pulse,
|
||||
)
|
||||
|
||||
item_renderer = /datum/gun_item_renderer/segments{
|
||||
@@ -64,7 +66,7 @@
|
||||
empty_state = TRUE;
|
||||
}
|
||||
|
||||
/obj/item/gun/energy/pulse_carbine
|
||||
/obj/item/gun/energy/nt_pulse/carbine
|
||||
name = "pulse carbine"
|
||||
desc = "A powerful energy carbine with multiple intensity selectors."
|
||||
// intentionally the same as all pulse weapons to save memory
|
||||
@@ -73,17 +75,16 @@
|
||||
allowing for a more laminar and cohesive beam than prior thought possible. Closely guarded designs to this day,
|
||||
pulse weapons are some of the only energy-based armaments able to consistently outperform any kinetic alternative.
|
||||
"}
|
||||
icon = 'icons/content/factions/corporations/nanotrasen/items/guns/pulse.dmi'
|
||||
icon_state = "carbine"
|
||||
base_icon_state = "carbine"
|
||||
render_mob_base = "pulse"
|
||||
base_mob_state = "pulse"
|
||||
slot_flags = SLOT_BELT
|
||||
// todo: firemode this
|
||||
fire_delay = 5 // might need to nerf this to 8 later, this is a very powerful weapon.
|
||||
|
||||
firemodes = list(
|
||||
/datum/firemode/energy/pulse_carbine/laser,
|
||||
/datum/firemode/energy/pulse_carbine/pulse,
|
||||
/datum/firemode/energy/nt_pulse/carbine/laser,
|
||||
/datum/firemode/energy/nt_pulse/carbine/pulse,
|
||||
)
|
||||
|
||||
item_renderer = /datum/gun_item_renderer/segments{
|
||||
@@ -1,8 +1,9 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 silicons *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
/datum/world_faction/corporation/nanotrasen
|
||||
name = "Nanotrasen"
|
||||
abbreviation = "NT"
|
||||
id = "nanotrasen"
|
||||
desc = "Nanotrasen - one of the great Trans-Stellar Corporations from the 2300s. A logistics and prototyping giant whose \
|
||||
claim to fame was the industrial synthesis of the Artificial Bluespace Crystal, they are one of the most prestigious \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//* This file is explicitly licensed under the MIT license. *//
|
||||
//* Copyright (c) 2024 silicons *//
|
||||
//* Copyright (c) 2024 Citadel Station Developers *//
|
||||
|
||||
// todo: supply system
|
||||
/datum/supply_pack/nanotrasen
|
||||
|
||||
@@ -165,5 +165,7 @@
|
||||
if(power_init_complete && use_power == USE_POWER_ACTIVE) // If this is the channel in use
|
||||
REPORT_POWER_CONSUMPTION_CHANGE(old_power, new_power_usage)
|
||||
|
||||
pass() // macro used immediately before being undefined; BYOND bug 2072419
|
||||
|
||||
#undef REPORT_POWER_CONSUMPTION_CHANGE
|
||||
#undef POWER_CONSUMPTION
|
||||
|
||||
@@ -299,6 +299,7 @@
|
||||
COLORTEST("00FF00", cm)
|
||||
COLORTEST("0000FF", cm)
|
||||
COLORTEST("FFFFFF", cm)
|
||||
pass() // macro used immediately before being undefined; BYOND bug 2072419
|
||||
#undef COLORTEST
|
||||
if(passed < minimum_matrix_tests)
|
||||
temp = "Matrix is too dark. (passed [passed] out of [minimum_matrix_tests] required tests. Minimum lightness: [minimum_matrix_lightness])."
|
||||
|
||||
@@ -1299,6 +1299,8 @@ GLOBAL_VAR_INIT(holopad_connectivity_rebuild_queued, FALSE)
|
||||
color = HOLO_NORMAL_COLOR
|
||||
alpha = HOLO_NORMAL_ALPHA
|
||||
|
||||
pass() // macro used immediately before being undefined; BYOND bug 2072419
|
||||
|
||||
#undef HOLO_NORMAL_COLOR
|
||||
#undef HOLO_VORE_COLOR
|
||||
#undef HOLO_NORMAL_ALPHA
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// todo: we need a new feedback system
|
||||
|
||||
/datum/feedback_variable
|
||||
var/variable
|
||||
var/value
|
||||
|
||||
@@ -73,9 +73,9 @@ Add those other swinging traps you mentioned above!
|
||||
|
||||
/obj/effect/trap/Initialize(mapload)
|
||||
. = ..()
|
||||
RegisterSimpleNetwork(id)
|
||||
simple_network_register(id)
|
||||
|
||||
/obj/effect/trap/SimpleNetworkReceive(id, message, list/data, datum/sender)
|
||||
/obj/effect/trap/simple_network_receive(id, message, list/data, datum/sender)
|
||||
. = ..()
|
||||
trip()
|
||||
|
||||
@@ -335,7 +335,7 @@ Add those other swinging traps you mentioned above!
|
||||
|
||||
/obj/effect/trap/launcher/Initialize(mapload)
|
||||
. = ..()
|
||||
RegisterSimpleNetwork(id)
|
||||
simple_network_register(id)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/effect/trap/launcher/fire()
|
||||
|
||||
@@ -571,7 +571,7 @@
|
||||
/obj/item/gun/energy/lasertag,
|
||||
/obj/item/gun/energy/netgun,
|
||||
/obj/item/gun/energy/phasegun/pistol,
|
||||
/obj/item/gun/energy/pulse_carbine,
|
||||
/obj/item/gun/energy/nt_pulse/carbine,
|
||||
/obj/item/gun/energy/retro,
|
||||
/obj/item/gun/energy/service,
|
||||
/obj/item/gun/energy/stunrevolver,
|
||||
|
||||
@@ -846,7 +846,7 @@
|
||||
prob(3);/obj/item/gun/energy/lasercannon,
|
||||
prob(3);/obj/item/gun/ballistic/shotgun/pump/rifle/lever,
|
||||
prob(3);/obj/item/gun/ballistic/automatic/bullpup,
|
||||
prob(2);/obj/item/gun/energy/pulse_rifle,
|
||||
prob(2);/obj/item/gun/energy/nt_pulse/rifle,
|
||||
prob(2);/obj/item/gun/energy/gun/nuclear,
|
||||
prob(2);/obj/item/gun/ballistic/automatic/lmg,
|
||||
prob(2);/obj/item/gun/energy/gun/burst,
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
/obj/item/clothing/accessory/holster/machete,
|
||||
/obj/item/reagent_containers/food/snacks/liquid,
|
||||
/obj/item/reagent_containers/food/snacks/liquid/protein,
|
||||
/obj/item/cataloguer)
|
||||
/obj/item/cataloguer,
|
||||
/obj/item/binoculars)
|
||||
|
||||
/obj/structure/closet/secure_closet/explorer/Initialize(mapload)
|
||||
if(prob(50))
|
||||
@@ -72,7 +73,10 @@
|
||||
/obj/item/gps/medical,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/bodybag/cryobag,
|
||||
/obj/item/cataloguer/compact)
|
||||
/obj/item/cataloguer/compact,
|
||||
/obj/item/binoculars,
|
||||
/obj/item/gun/ballistic/shotgun/flare/paramed,
|
||||
/obj/item/storage/box/flashshells/large)
|
||||
|
||||
//Pilot Locker
|
||||
/obj/structure/closet/secure_closet/pilot
|
||||
@@ -103,7 +107,8 @@
|
||||
/obj/item/cell/device,
|
||||
/obj/item/radio,
|
||||
/obj/item/gps/explorer,
|
||||
/obj/item/cataloguer/compact)
|
||||
/obj/item/cataloguer/compact,
|
||||
/obj/item/binoculars)
|
||||
|
||||
/obj/structure/closet/secure_closet/pilot/Initialize(mapload)
|
||||
if(prob(50))
|
||||
@@ -148,7 +153,8 @@
|
||||
/obj/item/reagent_containers/food/snacks/liquid,
|
||||
/obj/item/reagent_containers/food/snacks/liquid/protein,
|
||||
/obj/item/card/mining_point_card/survey/gimmick,
|
||||
/obj/item/cataloguer/compact/pathfinder)
|
||||
/obj/item/cataloguer/compact/pathfinder,
|
||||
/obj/item/binoculars)
|
||||
|
||||
/obj/structure/closet/secure_closet/pathfinder/Initialize(mapload)
|
||||
if(prob(50))
|
||||
|
||||
@@ -1198,60 +1198,60 @@ var/list/floor_decals = list()
|
||||
|
||||
// Victory colour decals
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue
|
||||
name = "darkblue corner"
|
||||
color = COLOR_BLUE
|
||||
/obj/effect/floor_decal/corner/navblue
|
||||
name = "navblue corner"
|
||||
color = COLOR_NAV_BLUE
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/diagonal
|
||||
/obj/effect/floor_decal/corner/navblue/diagonal
|
||||
icon_state = "corner_white_diagonal"
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/full
|
||||
/obj/effect/floor_decal/corner/navblue/full
|
||||
icon_state = "corner_white_full"
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/three_quarters
|
||||
/obj/effect/floor_decal/corner/navblue/three_quarters
|
||||
icon_state = "corner_white_three_quarters"
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/border
|
||||
/obj/effect/floor_decal/corner/navblue/border
|
||||
icon_state = "bordercolor"
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/bordercorner
|
||||
/obj/effect/floor_decal/corner/navblue/bordercorner
|
||||
icon_state = "bordercolorcorner"
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/bordercorner2
|
||||
/obj/effect/floor_decal/corner/navblue/bordercorner2
|
||||
icon_state = "bordercolorcorner2"
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/borderfull
|
||||
/obj/effect/floor_decal/corner/navblue/borderfull
|
||||
icon_state = "bordercolorfull"
|
||||
|
||||
/obj/effect/floor_decal/corner/darkblue/bordercee
|
||||
/obj/effect/floor_decal/corner/navblue/bordercee
|
||||
icon_state = "bordercolorcee"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold
|
||||
name = "gold corner"
|
||||
color = COLOR_GOLD
|
||||
/obj/effect/floor_decal/corner/navgold
|
||||
name = "navgold corner"
|
||||
color = COLOR_NAV_GOLD
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/diagonal
|
||||
/obj/effect/floor_decal/corner/navgold/diagonal
|
||||
icon_state = "corner_white_diagonal"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/full
|
||||
/obj/effect/floor_decal/corner/navgold/full
|
||||
icon_state = "corner_white_full"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/three_quarters
|
||||
/obj/effect/floor_decal/corner/navgold/three_quarters
|
||||
icon_state = "corner_white_three_quarters"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/border
|
||||
/obj/effect/floor_decal/corner/navgold/border
|
||||
icon_state = "bordercolor"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/bordercorner
|
||||
/obj/effect/floor_decal/corner/navgold/bordercorner
|
||||
icon_state = "bordercolorcorner"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/bordercorner2
|
||||
/obj/effect/floor_decal/corner/navgold/bordercorner2
|
||||
icon_state = "bordercolorcorner2"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/borderfull
|
||||
/obj/effect/floor_decal/corner/navgold/borderfull
|
||||
icon_state = "bordercolorfull"
|
||||
|
||||
/obj/effect/floor_decal/corner/gold/bordercee
|
||||
/obj/effect/floor_decal/corner/navgold/bordercee
|
||||
icon_state = "bordercolorcee"
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
visible_message("<span class='danger'>You hear a click nearby!</span>")
|
||||
update_icon()
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
SimpleNetworkSend(id, "trip")
|
||||
simple_network_send(id, "trip")
|
||||
return
|
||||
|
||||
/turf/simulated/floor/trap/update_icon()
|
||||
@@ -50,7 +50,7 @@
|
||||
visible_message("<span class='danger'>You hear a click nearby!</span>")
|
||||
update_icon()
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
SimpleNetworkSend(id, "trip")
|
||||
simple_network_send(id, "trip")
|
||||
return
|
||||
|
||||
//Types
|
||||
|
||||
@@ -1087,47 +1087,6 @@ var/datum/legacy_announcement/minor/admin_min_announcer = new
|
||||
new /obj/effect/plant(get_turf(usr), SSplants.seeds[seedtype])
|
||||
log_admin("[key_name(usr)] spawned [seedtype] vines at ([usr.x],[usr.y],[usr.z])")
|
||||
|
||||
/datum/admins/proc/spawn_atom(var/object as text)
|
||||
set category = "Debug"
|
||||
set desc = "(atom path) Spawn an atom"
|
||||
set name = "Spawn"
|
||||
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
if(!object)
|
||||
var/choice = alert(src, "You haven't specified anything to match -- this will lock your game up and take a while! \
|
||||
It will also return the entire spawn list.", "WARNING!", "Cancel", "Continue")
|
||||
if(choice == "Cancel")
|
||||
return
|
||||
|
||||
var/list/types = typesof(/atom)
|
||||
var/list/matches = new()
|
||||
|
||||
for(var/path in types)
|
||||
if(findtext("[path]", object))
|
||||
CHECK_TICK
|
||||
matches += path
|
||||
|
||||
if(matches.len==0)
|
||||
return
|
||||
|
||||
var/chosen
|
||||
if(matches.len==1)
|
||||
chosen = matches[1]
|
||||
else
|
||||
chosen = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches
|
||||
if(!chosen)
|
||||
return
|
||||
if(ispath(chosen,/turf))
|
||||
var/turf/T = get_turf(usr.loc)
|
||||
T.ChangeTurf(chosen)
|
||||
else
|
||||
new chosen(usr.loc)
|
||||
|
||||
log_and_message_admins("spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
|
||||
feedback_add_details("admin_verb","SA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/datum/admins/proc/show_traitor_panel(var/mob/M in GLOB.mob_list)
|
||||
set category = "Admin"
|
||||
set desc = "Edit mobs's memory and role"
|
||||
|
||||
@@ -150,7 +150,7 @@ var/list/admin_verbs_spawn = list(
|
||||
/datum/admins/proc/spawn_custom_item,
|
||||
/datum/admins/proc/check_custom_items,
|
||||
/datum/admins/proc/spawn_plant,
|
||||
/datum/admins/proc/spawn_atom, // Allows us to spawn instances,
|
||||
/client/proc/spawn_atom, // Allows us to spawn instances,
|
||||
/client/proc/respawn_character,
|
||||
/client/proc/spawn_character_mob,
|
||||
/client/proc/virus2_editor,
|
||||
|
||||
@@ -1655,7 +1655,7 @@
|
||||
else if(!ispath(path, /obj) && !ispath(path, /turf) && !ispath(path, /mob))
|
||||
removed_paths += dirty_path
|
||||
continue
|
||||
else if(ispath(path, /obj/item/gun/energy/pulse_rifle))
|
||||
else if(ispath(path, /obj/item/gun/energy/nt_pulse/rifle))
|
||||
if(!check_rights(R_FUN,0))
|
||||
removed_paths += dirty_path
|
||||
continue
|
||||
|
||||
13
code/modules/admin/verbs/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Admin Verbs
|
||||
|
||||
Admin verbs should only be made for absolute necessity.
|
||||
|
||||
BYOND verbs are bad. Secrets panel entries, and verbs that open full panels are much more preferred.
|
||||
|
||||
Verbs are justified for;
|
||||
|
||||
- right click context menu needs (rejuvenate, select equipment, view variables)
|
||||
- very common actions (delete, spawn)
|
||||
- low-level debug backends (sdql, restart controller)
|
||||
|
||||
If in doubt, it shouldn't be a verb.
|
||||
50
code/modules/admin/verbs/debug/spawn.dm
Normal file
@@ -0,0 +1,50 @@
|
||||
/client/proc/spawn_atom(query as text)
|
||||
set category = "Debug"
|
||||
set desc = "(atom path) Spawn an atom"
|
||||
set name = "Spawn"
|
||||
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
|
||||
if(length(query) < 5)
|
||||
var/confirm = alert(
|
||||
src,
|
||||
"You haven't specified a long enough filter; this will take a while. Are you sure?",
|
||||
"Mass Query Confirmation",
|
||||
"No",
|
||||
"Yes"
|
||||
)
|
||||
if(confirm != "Yes")
|
||||
return
|
||||
|
||||
var/list/matches = list()
|
||||
for(var/path in typesof(/atom))
|
||||
if(findtext("[path]", query))
|
||||
matches += path
|
||||
CHECK_TICK
|
||||
|
||||
if(!length(matches))
|
||||
to_chat(src, SPAN_WARNING("Type query for '[query]' returned nothing."))
|
||||
return
|
||||
|
||||
// todo: special prefix handling like # / ! / similar for fast-pathing?
|
||||
var/path_to_spawn
|
||||
if(length(matches) == 1)
|
||||
path_to_spawn = matches[1]
|
||||
else
|
||||
var/list/processed_types = make_types_fancy(matches)
|
||||
var/picked_name = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in processed_types
|
||||
if(!picked_name)
|
||||
return
|
||||
path_to_spawn = processed_types[picked_name]
|
||||
|
||||
if(!path_to_spawn)
|
||||
return
|
||||
|
||||
if(ispath(path_to_spawn, /turf))
|
||||
var/turf/T = get_turf(mob)
|
||||
T.ChangeTurf(path_to_spawn)
|
||||
else
|
||||
new path_to_spawn(mob.loc)
|
||||
|
||||
log_and_message_admins("spawned [path_to_spawn] at ([usr.x],[usr.y],[usr.z])")
|
||||
@@ -161,7 +161,7 @@
|
||||
prob(6);/obj/item/gun/ballistic/automatic/lmg,\
|
||||
prob(6);/obj/item/gun/energy/lasercannon,\
|
||||
prob(5);/obj/item/gun/ballistic/automatic/bullpup,\
|
||||
prob(5);/obj/item/gun/energy/pulse_rifle,\
|
||||
prob(5);/obj/item/gun/energy/nt_pulse/rifle,\
|
||||
/* prob(4);/obj/item/gun/ballistic/automatic/battlerifle,\ */
|
||||
prob(3);/obj/item/gun/ballistic/deagle/camo,\
|
||||
prob(3);/obj/item/gun/energy/gun/nuclear,\
|
||||
|
||||
@@ -9,7 +9,24 @@
|
||||
|
||||
/atom/
|
||||
var/description_info = null //Helpful blue text.
|
||||
var/description_fluff = null //Green text about the atom's fluff, if any exists.
|
||||
|
||||
/**
|
||||
* Lore fluff.
|
||||
*
|
||||
* todo: rename this maybe, rework examines
|
||||
*
|
||||
* * "This snowflake weapon made for my Mary Sue was made by the Nanotrasen Department of Deniable Operations and fires 75x400mm artillery shells out of the barrel with the power of bluespace."
|
||||
*/
|
||||
var/description_fluff
|
||||
/**
|
||||
* Lore fluff, part 2.
|
||||
*
|
||||
* todo: rename this maybe, rework examines
|
||||
*
|
||||
* * This is appended at the end of [description_fluff]. Useful for things like "this is part of a group of similar blah blah blah's".
|
||||
*/
|
||||
var/description_fluff_categorizer
|
||||
|
||||
var/description_antag = null //Malicious red text, for the antags.
|
||||
|
||||
//Override these if you need special behaviour for a specific type.
|
||||
@@ -19,9 +36,13 @@
|
||||
return
|
||||
|
||||
/atom/proc/get_description_fluff()
|
||||
if(description_fluff)
|
||||
return description_fluff
|
||||
return
|
||||
. = description_fluff
|
||||
if(description_fluff_categorizer)
|
||||
if(.)
|
||||
. += "<hr>"
|
||||
. += description_fluff_categorizer
|
||||
else
|
||||
. = description_fluff_categorizer
|
||||
|
||||
/atom/proc/get_description_antag()
|
||||
if(description_antag)
|
||||
|
||||
@@ -34,6 +34,6 @@
|
||||
uniform = /obj/item/clothing/under/rank/centcom
|
||||
l_ear = /obj/item/radio/headset/centcom
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
belt = /obj/item/gun/energy/pulse_carbine
|
||||
belt = /obj/item/gun/energy/nt_pulse/carbine
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
head = /obj/item/clothing/head/beret/centcom/officer
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
|
||||
back = /obj/item/storage/backpack/satchel
|
||||
belt = /obj/item/gun/energy/pulse_carbine
|
||||
belt = /obj/item/gun/energy/nt_pulse/carbine
|
||||
flags = OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL
|
||||
|
||||
/datum/outfit/job/station/emergency_responder/post_equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -337,6 +337,8 @@
|
||||
return RESOLVE(link_above)
|
||||
if(DOWN)
|
||||
return RESOLVE(link_below)
|
||||
else
|
||||
pass() // macro used immediately before being undefined; BYOND bug 2072419
|
||||
#undef RESOLVE
|
||||
|
||||
/**
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
|
||||
armor_type = /datum/armor/physiology/roach/atomar
|
||||
|
||||
base_attack_cooldown = 4
|
||||
base_attack_cooldown = 2 SECONDS
|
||||
projectiletype = /obj/projectile/energy/blob/toxic
|
||||
projectilesound = 'sound/effects/slime_squish.ogg'
|
||||
|
||||
@@ -426,7 +426,7 @@
|
||||
taser_kill = 0
|
||||
armor_type = /datum/armor/physiology/roach/strahland
|
||||
|
||||
base_attack_cooldown = 4
|
||||
base_attack_cooldown = 2 SECONDS
|
||||
projectiletype = /obj/projectile/energy/dart
|
||||
|
||||
ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
////////////////////////////
|
||||
// Burning Runner
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/nuclear_spirits/burning
|
||||
name = "Burning Runner"
|
||||
desc = "A paranatural creature resembling a burning humanoid. \
|
||||
More energy then anything solid it aborbs heat into its body \
|
||||
however it has a low tolerance for kinectic energy and quickly \
|
||||
falls apart into a charred husk from blunt attacks. The Burning \
|
||||
Runner charges its foes fearlessly attempting to spread its blaze \
|
||||
to its victims. Perhaps it seeks to share its eternal agony."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/burning
|
||||
name = "Burning Runner"
|
||||
real_name = "Burning Runner"
|
||||
desc = "The burning man shares its fire with all."
|
||||
icon_state = "burning"
|
||||
icon_living = "burning"
|
||||
icon_dead = "burning_dead"
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
legacy_melee_damage_lower = 10
|
||||
legacy_melee_damage_upper = 10
|
||||
attacktext = list("swipes")
|
||||
friendly = list("caresses")
|
||||
movement_cooldown = -1
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/nuclear_spirits/burning)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/evasive
|
||||
|
||||
armor_legacy_mob = list( //Mob Gimmick, highly resistant to E weapons //Mob Gimmick, absorbs normal burn damage,
|
||||
"melee" = -0,
|
||||
"bullet" = 0,
|
||||
"laser" = 90,
|
||||
"energy" = 90,
|
||||
"bomb" = 0,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/burning/handle_light()
|
||||
. = ..()
|
||||
if(. == 0 && !is_dead())
|
||||
set_light(2.5, 1, COLOR_ORANGE)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/burning/apply_melee_effects(mob/living/carbon/M, alien, removed)
|
||||
if(M.fire_stacks <= 2)
|
||||
M.adjust_fire_stacks(1)
|
||||
M.IgniteMob()
|
||||
@@ -0,0 +1,40 @@
|
||||
////////////////////////////
|
||||
// Charred
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/nuclear_spirits/charred
|
||||
name = "Charred Runner"
|
||||
desc = "A paranatural creature resembling a charred corpse. \
|
||||
The carbonized 'flesh' of this creature is adept at absorbing \
|
||||
energy but vulnerable to kinectic force. Lacking any innate \
|
||||
sense of self preservation these creatures throw themselves at \
|
||||
their attackers with no apparent regard for their own lives \
|
||||
leaving behind their charred shell as they expire."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/charred
|
||||
name = "Charred Runner"
|
||||
real_name = "Charred Runner"
|
||||
desc = "A charred corpse: animated and coming right for you."
|
||||
icon_state = "charred"
|
||||
icon_living = "charred"
|
||||
icon_dead = "charred_dead"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
legacy_melee_damage_lower = 10
|
||||
legacy_melee_damage_upper = 10
|
||||
attacktext = list("slapped")
|
||||
friendly = list("caresses")
|
||||
movement_cooldown = 0
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/nuclear_spirits/charred)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/evasive
|
||||
|
||||
armor_legacy_mob = list(
|
||||
"melee" = -50,
|
||||
"bullet" = 0,
|
||||
"laser" = 50,
|
||||
"energy" = 50,
|
||||
"bomb" = -50,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
@@ -0,0 +1,49 @@
|
||||
////////////////////////////
|
||||
// Demoncore
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/nuclear_spirits/demoncore
|
||||
name = "%#ERROR#%"
|
||||
desc = "%ERROR% RADIATION DETECTED DATA CORRUPTED. %ERROR%"
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/demoncore //A big ball of radiation, kills enemies by giving them radiation poisoning
|
||||
name = "Demon Core"
|
||||
real_name = "Demon Core"
|
||||
desc = "Floating in the sky appears to a plutonium sphere undergoing a perpetual criticality incident. It seems to desire to meet you closely."
|
||||
icon_state = "demoncore"
|
||||
icon_living = "demoncore"
|
||||
maxHealth = 200 //Tanky but not tough this thing just wants to be alive long enough to spread its radiation.
|
||||
health = 200
|
||||
response_harm = "viciously beaten"
|
||||
harm_intent_damage = 5
|
||||
legacy_melee_damage_lower = 20
|
||||
legacy_melee_damage_upper = 25 //Come to think of it this is probably real dense to be ramming people
|
||||
attack_armor_pen = 50
|
||||
attacktext = list("rammed")
|
||||
attack_sound = 'sound/effects/clang1.ogg'
|
||||
movement_cooldown = 4
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/nuclear_spirits/demoncore)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/evasive
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/demoncore/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/horror_aura)
|
||||
AddComponent(/datum/component/radioactive, 1000 , 0, TRUE, RAD_FALLOFF_CONTAMINATION_NORMAL)
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/demoncore/handle_light()
|
||||
. = ..()
|
||||
if(. == 0 && !is_dead())
|
||||
set_light(6, 1, COLOR_BLUE)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/demoncore/death()
|
||||
..()
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.has_status_effect(/datum/status_effect/sight/blindness) )))
|
||||
M.show_message("<font color='red'>[src] screeches and explodes in a blue flash.</font>")
|
||||
playsound(src, 'sound/items/geiger/ext1.ogg', 100, 1)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
////////////////////////////
|
||||
// Gamma Wraith
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/gammawraith
|
||||
name = "Gammawraith"
|
||||
real_name = "Gammawraith"
|
||||
desc = "A glowing phantom wearing a spectral radiation suit. You can hear geiger counters screaming in your mind."
|
||||
icon_state = "atomic"
|
||||
icon_living = "atomic"
|
||||
icon_dead = "atomic_dead"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/nuclear_spirits/gammawraith)
|
||||
|
||||
response_help = "glows menacingly at"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "swipes"
|
||||
|
||||
legacy_melee_damage_lower = 5
|
||||
legacy_melee_damage_upper = 15
|
||||
attacktext = list("rips into")
|
||||
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 4000
|
||||
min_oxy = 0
|
||||
max_co2 = 0
|
||||
max_tox = 0
|
||||
|
||||
universal_speak = 1
|
||||
|
||||
loot_list = list(/obj/effect/debris/cleanable/greenglow = 100)
|
||||
|
||||
projectiletype = /obj/projectile/beam/gamma
|
||||
projectilesound = 'sound/items/geiger/ext3.ogg'
|
||||
|
||||
base_attack_cooldown = 30 //As the projectile is AP Hitscan it fires relatively slowly
|
||||
ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged
|
||||
|
||||
/datum/category_item/catalogue/fauna/nuclear_spirits/gammawraith
|
||||
name = "%#ERROR#%"
|
||||
desc = "%ERROR% RADIATION DETECTED DATA CORRUPTED. %ERROR%"
|
||||
value = CATALOGUER_REWARD_TRIVIAL
|
||||
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/gammawraith/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/horror_aura)
|
||||
AddComponent(/datum/component/radioactive, 500 , 0, TRUE, RAD_FALLOFF_CONTAMINATION_NORMAL)
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/gammawraith/handle_light()
|
||||
. = ..()
|
||||
if(. == 0 && !is_dead())
|
||||
set_light(2.5, 1, COLOR_GREEN)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_mob/construct/nuclear/gammawraith/death()
|
||||
..()
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.has_status_effect(/datum/status_effect/sight/blindness) )))
|
||||
M.show_message("<font color='red'>[src] screeches and explodes in a green flash.</font>")
|
||||
playsound(src, 'sound/items/geiger/ext1.ogg', 100, 1)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
@@ -648,3 +648,24 @@ GLOBAL_VAR_INIT(organ_combined_size, 25 + 70 + 30 + 25 + 25 + 25 + 25 + 10 + 10
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
// asks ghosts to take control of a mob, ported from cit main
|
||||
/proc/offer_control(mob/M,ignore_category=null)
|
||||
if(usr)
|
||||
log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.")
|
||||
message_admins("[key_name_admin(usr)] has offered control of ([ADMIN_LOOKUPFLW(M)]) to ghosts")
|
||||
|
||||
var/datum/ghost_query/admin/query = new()
|
||||
query.wait_time = 15 SECONDS
|
||||
var/mob_name = M.real_name ? M.real_name : M.name
|
||||
query.role_name = mob_name
|
||||
query.question = "Do you want to play as [mob_name]?"
|
||||
spawn(0)
|
||||
query.query()
|
||||
if(LAZYLEN(query.candidates))
|
||||
var/mob/C = pick(query.candidates)
|
||||
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(M)])")
|
||||
M.ghostize(FALSE, TRUE)
|
||||
C.transfer_client_to(M, FALSE)
|
||||
else
|
||||
message_admins("No ghosts were willing to take control of [ADMIN_LOOKUPFLW(M)])")
|
||||
|
||||
@@ -195,41 +195,6 @@ GLOBAL_LIST_EMPTY(cached_physiology_modifiers)
|
||||
continue
|
||||
physiology.apply(modifier)
|
||||
|
||||
/mob/vv_get_dropdown()
|
||||
. = ..()
|
||||
VV_DROPDOWN_OPTION(null, "-----")
|
||||
VV_DROPDOWN_OPTION(VV_HK_ADD_PHYSIOLOGY_MODIFIER, "Add Physiology Modifier")
|
||||
VV_DROPDOWN_OPTION(VV_HK_REMOVE_PHYSIOLOGY_MODIFIER, "Remove Physiology Modifier")
|
||||
|
||||
/mob/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
if(href_list[VV_HK_ADD_PHYSIOLOGY_MODIFIER])
|
||||
// todo: this should be able to be done globally via admin panel and then added to mobs
|
||||
|
||||
var/datum/physiology_modifier/modifier = ask_admin_for_a_physiology_modifier(usr)
|
||||
|
||||
if(isnull(modifier))
|
||||
return
|
||||
if(QDELETED(src))
|
||||
return
|
||||
|
||||
log_admin("[key_name(usr)] --> [key_name(src)] - added physiology modifier [json_encode(modifier.serialize())]")
|
||||
add_physiology_modifier(modifier)
|
||||
return TRUE
|
||||
|
||||
if(href_list[VV_HK_REMOVE_PHYSIOLOGY_MODIFIER])
|
||||
var/list/assembled = list()
|
||||
var/i = 0
|
||||
for(var/datum/physiology_modifier/modifier as anything in physiology_modifiers)
|
||||
assembled["[modifier.name] (#[++i])"] = modifier
|
||||
var/picked = input(usr, "Which modifier to remove? Please do not do this unless you know what you are doing.", "Remove Physiology Modifier") as null|anything in assembled
|
||||
var/datum/physiology_modifier/removing = assembled[picked]
|
||||
if(!(removing in physiology_modifiers))
|
||||
return TRUE
|
||||
log_admin("[key_name(usr)] --> [key_name(src)] - removed physiology modifier [json_encode(removing.serialize())]")
|
||||
remove_physiology_modifier(removing)
|
||||
return TRUE
|
||||
|
||||
// i'm not going to fucking support vv without automated backreferences and macros, holy shit.
|
||||
// /mob/proc/get_varedit_physiology_modifier()
|
||||
// RETURN_TYPE(/datum/physiology_modifier)
|
||||
|
||||
@@ -9,3 +9,42 @@
|
||||
set_pixel_shift_y(var_value)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/mob/vv_get_dropdown()
|
||||
. = ..()
|
||||
VV_DROPDOWN_OPTION(null, "-----")
|
||||
VV_DROPDOWN_OPTION(VV_HK_ADD_PHYSIOLOGY_MODIFIER, "Add Physiology Modifier")
|
||||
VV_DROPDOWN_OPTION(VV_HK_REMOVE_PHYSIOLOGY_MODIFIER, "Remove Physiology Modifier")
|
||||
VV_DROPDOWN_OPTION(VV_HK_TRIGGER_OFFER_MOB_TO_GHOSTS, "Offer Mob To Ghosts")
|
||||
|
||||
/mob/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
if(href_list[VV_HK_ADD_PHYSIOLOGY_MODIFIER])
|
||||
// todo: this should be able to be done globally via admin panel and then added to mobs
|
||||
|
||||
var/datum/physiology_modifier/modifier = ask_admin_for_a_physiology_modifier(usr)
|
||||
|
||||
if(isnull(modifier))
|
||||
return
|
||||
if(QDELETED(src))
|
||||
return
|
||||
|
||||
log_admin("[key_name(usr)] --> [key_name(src)] - added physiology modifier [json_encode(modifier.serialize())]")
|
||||
add_physiology_modifier(modifier)
|
||||
return TRUE
|
||||
|
||||
if(href_list[VV_HK_REMOVE_PHYSIOLOGY_MODIFIER])
|
||||
var/list/assembled = list()
|
||||
var/i = 0
|
||||
for(var/datum/physiology_modifier/modifier as anything in physiology_modifiers)
|
||||
assembled["[modifier.name] (#[++i])"] = modifier
|
||||
var/picked = input(usr, "Which modifier to remove? Please do not do this unless you know what you are doing.", "Remove Physiology Modifier") as null|anything in assembled
|
||||
var/datum/physiology_modifier/removing = assembled[picked]
|
||||
if(!(removing in physiology_modifiers))
|
||||
return TRUE
|
||||
log_admin("[key_name(usr)] --> [key_name(src)] - removed physiology modifier [json_encode(removing.serialize())]")
|
||||
remove_physiology_modifier(removing)
|
||||
return TRUE
|
||||
|
||||
if(href_list[VV_HK_TRIGGER_OFFER_MOB_TO_GHOSTS])
|
||||
offer_control(src)
|
||||
|
||||
@@ -153,6 +153,7 @@
|
||||
SHOULD_CALL_PARENT(FALSE)
|
||||
atom_flags |= ATOM_INITIALIZED
|
||||
SSzcopy.openspace_overlays += 1
|
||||
loc?.Entered(src, null)
|
||||
|
||||
/atom/movable/openspace/mimic/Destroy()
|
||||
SSzcopy.openspace_overlays -= 1
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/**
|
||||
* Sends a simple network message.
|
||||
*
|
||||
* @param
|
||||
* id - id of network to send to
|
||||
* message - message to send or null
|
||||
* data - arbitrary list or null
|
||||
* range - range from the current atom, defaults to ignoring.
|
||||
*/
|
||||
/atom/SimpleNetworkSend(id, message, list/data, range = INFINITY)
|
||||
if(range == INFINITY)
|
||||
return ..()
|
||||
var/list/devices = SSnetworks.GetSimpleDevicesRange(id, src, range)
|
||||
for(var/datum/D as anything in devices)
|
||||
D.SimpleNetworkReceive(id, message, data, src)
|
||||
@@ -1,18 +0,0 @@
|
||||
/**
|
||||
* Sends a simple network message.
|
||||
*
|
||||
* @param
|
||||
* id - id of network to send to
|
||||
* message - message to send or null
|
||||
* data - arbitrary list or null
|
||||
*/
|
||||
/datum/proc/SimpleNetworkSend(id, message, list/data)
|
||||
var/list/devices = SSnetworks.GetSimpleDevices(id)
|
||||
for(var/datum/D as anything in devices)
|
||||
D.SimpleNetworkReceive(id, message, data, src)
|
||||
|
||||
/**
|
||||
* Called on receiving a simple network message - register to these by adding the element.
|
||||
*/
|
||||
/datum/proc/SimpleNetworkReceive(id, message, list/data, datum/sender)
|
||||
return
|
||||
@@ -1,20 +0,0 @@
|
||||
/datum/element/simple_network
|
||||
element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
|
||||
id_arg_index = 1
|
||||
var/id
|
||||
|
||||
/datum/element/simple_network/Attach(datum/target, id)
|
||||
. = ..()
|
||||
if(. & ELEMENT_INCOMPATIBLE)
|
||||
return
|
||||
src.id = id
|
||||
if(SSnetworks.simple_network_lookup[id])
|
||||
SSnetworks.simple_network_lookup[id] |= target
|
||||
else
|
||||
SSnetworks.simple_network_lookup[id] = list(target)
|
||||
|
||||
/datum/element/simple_network/Detach(datum/source)
|
||||
SSnetworks.simple_network_lookup[id] -= source
|
||||
if(!length(SSnetworks.simple_network_lookup[id]))
|
||||
SSnetworks.simple_network_lookup -= id
|
||||
return ..()
|
||||
@@ -1,2 +0,0 @@
|
||||
/datum/proc/RegisterSimpleNetwork(id)
|
||||
AddElement(/datum/element/simple_network, id)
|
||||
@@ -148,6 +148,15 @@
|
||||
RETURN_TYPE(/datum/ammo_caliber)
|
||||
return resolve_caliber(caliber)
|
||||
|
||||
//* Render *//
|
||||
|
||||
/**
|
||||
* makes us look messier, basically
|
||||
*/
|
||||
/obj/item/ammo_casing/proc/randomize_offsets_after_eject()
|
||||
pixel_x = rand(-8, 8)
|
||||
pixel_y = rand(-8, 8)
|
||||
|
||||
//* Generic - Spent Subtype *//
|
||||
|
||||
/obj/item/ammo_casing/spent
|
||||
|
||||
@@ -28,6 +28,11 @@
|
||||
///
|
||||
/// * this is a bitfield
|
||||
var/magazine_type = MAGAZINE_TYPE_NORMAL
|
||||
/// the class we ask the gun to render us as
|
||||
///
|
||||
/// * uses MAGAZINE_CLASS_* flags
|
||||
/// * if our requested class isn't on a gun, the gun reserves the right to render us as the default class ('-mag')
|
||||
var/magazine_class = MAGAZINE_CLASS_GENERIC
|
||||
|
||||
//* for magazines
|
||||
/// magazine type - must match gun's to be fitted into it, if gun's is
|
||||
@@ -56,7 +61,7 @@
|
||||
/// sound for loading a piece of ammo
|
||||
var/load_sound = 'sound/weapons/flipblade.ogg'
|
||||
|
||||
//* ammo storage *//
|
||||
//* Ammo *//
|
||||
/// max ammo in us
|
||||
var/ammo_max = 7
|
||||
/// currently stored ammo; defaults to ammo_max if unset
|
||||
@@ -76,25 +81,30 @@
|
||||
/// index 1 is the bottom, index ammo_internal.len is the top of the magazine.
|
||||
/// peek/draw will peek/draw the last index first all the way to the first, and after that,
|
||||
/// ammo_current is considered the 'reserve' pool (as just a number).
|
||||
var/list/ammo_internal
|
||||
var/list/obj/item/ammo_casing/ammo_internal
|
||||
/// caliber - set to typepath to init
|
||||
var/ammo_caliber
|
||||
/// preloaded ammo type
|
||||
var/ammo_preload
|
||||
/// if set, only loads ammo of this type
|
||||
var/ammo_type
|
||||
/// if set, only loads ammo matching this restrict value
|
||||
///
|
||||
/// * ammo by default has their typepath as the restrict value
|
||||
/// * ammo can set strings / enums to this too; make sure to #define them.
|
||||
var/ammo_restrict
|
||||
/// if set, doesn't allow subtypes
|
||||
var/ammo_picky = FALSE
|
||||
var/ammo_restrict_no_subtypes = FALSE
|
||||
/// init all contents on initialize instead of lazy-drawing
|
||||
///
|
||||
/// * used for things like microbatteries / legacy content
|
||||
var/ammo_legacy_init_everything = FALSE
|
||||
|
||||
//* Rendering
|
||||
//* Rendering *//
|
||||
/// use default rendering system
|
||||
/// in state mode, we will be "[base_icon_state]-[count]", from 0 to count (0 for empty)
|
||||
/// in segements mode, we will repeatedly add "[base_icon_state]-ammo" with given offsets.
|
||||
/// overlay mode is not supported
|
||||
/// in segments mode, we will repeatedly add "[base_icon_state]-ammo" with given offsets.
|
||||
///
|
||||
/// * overlays moade is not supported;
|
||||
/// todo: in overlays mode, we should be "[base_icon_state]-[count]" from 0 to count, overlaid, while we have ammo
|
||||
var/rendering_system = GUN_RENDERING_DISABLED
|
||||
/// number of states
|
||||
var/rendering_count = 0
|
||||
@@ -110,9 +120,11 @@
|
||||
var/rendering_segment_y_offset = 0
|
||||
/// display special "[base_icon_state]-empty" if count == 0
|
||||
var/rendering_segment_use_empty = FALSE
|
||||
/// add a specific overlay as "[base_icon_state]-[state]", useful for denoting different magazines
|
||||
/// add a specific overlay, useful for denoting different magazines
|
||||
/// that look similar with a stripe
|
||||
var/rendering_static_overlay
|
||||
/// color the static overlay this way
|
||||
var/rendering_static_overlay_color
|
||||
|
||||
/obj/item/ammo_magazine/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -121,7 +133,10 @@
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
if(!isnull(rendering_static_overlay))
|
||||
add_overlay(rendering_static_overlay, TRUE)
|
||||
var/image/static_overlay = image(icon, rendering_static_overlay)
|
||||
if(rendering_static_overlay_color)
|
||||
static_overlay.color = rendering_static_overlay_color
|
||||
add_overlay(static_overlay, TRUE)
|
||||
|
||||
if(ammo_legacy_init_everything)
|
||||
instantiate_internal_list()
|
||||
@@ -132,17 +147,17 @@
|
||||
|
||||
/obj/item/ammo_magazine/get_containing_worth(flags)
|
||||
. = ..()
|
||||
var/obj/item/ammo_casing/ammo_casted = ammo_type
|
||||
var/obj/item/ammo_casing/ammo_casted = ammo_restrict
|
||||
. += (isnull(ammo_current)? ammo_max : ammo_current) * initial(ammo_casted.worth_intrinsic)
|
||||
|
||||
/obj/item/ammo_magazine/detect_material_base_costs()
|
||||
. = ..()
|
||||
if(isnull(ammo_type))
|
||||
if(isnull(ammo_restrict))
|
||||
return
|
||||
var/shell_amount = isnull(ammo_current)? ammo_max : ammo_current
|
||||
if(!shell_amount)
|
||||
return
|
||||
var/obj/item/ammo_casing/casing = new ammo_type
|
||||
var/obj/item/ammo_casing/casing = new ammo_restrict
|
||||
if(!istype(casing))
|
||||
qdel(casing)
|
||||
return
|
||||
@@ -214,7 +229,7 @@
|
||||
/obj/item/ammo_magazine/proc/why_cant_load_casing(obj/item/ammo_casing/casing)
|
||||
if(!loads_caliber(casing.caliber))
|
||||
return "mismatched caliber"
|
||||
if(ammo_type && (ammo_picky ? casing.type != ammo_type : !istype(casing, ammo_type)))
|
||||
if(ammo_restrict && (ammo_restrict_no_subtypes ? casing.type != ammo_restrict : !istype(casing, ammo_restrict)))
|
||||
return "mismatched ammo"
|
||||
|
||||
/obj/item/ammo_magazine/on_attack_self(datum/event_args/actor/e_args)
|
||||
@@ -430,6 +445,18 @@
|
||||
/obj/item/ammo_magazine/proc/amount_missing(live_only)
|
||||
return ammo_max - amount_remaining(live_only)
|
||||
|
||||
/**
|
||||
* Gets the predicted typepath of a casing a given index from the top, where 1 is the top.
|
||||
*
|
||||
* * Real casings are read.
|
||||
* * Fake casings are predicted from the type that would have been lazy-generated.
|
||||
* * Null if something isn't there / left
|
||||
*/
|
||||
/obj/item/ammo_magazine/proc/peek_path_of_position(index)
|
||||
if(index > length(ammo_internal))
|
||||
return (index - length(ammo_internal)) >= ammo_current ? ammo_preload : null
|
||||
return ammo_internal[length(ammo_internal) - index]?.type
|
||||
|
||||
//* Caliber *//
|
||||
|
||||
/obj/item/ammo_magazine/proc/loads_caliber(datum/ammo_caliber/caliberlike)
|
||||
|
||||
@@ -201,8 +201,6 @@
|
||||
ammo_max = 2
|
||||
rendering_system = GUN_RENDERING_STATES
|
||||
rendering_count = 2
|
||||
ammo_picky = TRUE
|
||||
ammo_type = /obj/item/ammo_casing/a12g
|
||||
magazine_type = MAGAZINE_TYPE_CLIP
|
||||
|
||||
/obj/item/ammo_magazine/a12g/clip/pellet
|
||||
@@ -211,7 +209,6 @@
|
||||
base_icon_state = "a12-buck"
|
||||
desc = "A color-coded metal clip for holding and quickly loading shotgun shells. This one is loaded with buckshot."
|
||||
ammo_preload = /obj/item/ammo_casing/a12g/pellet
|
||||
ammo_type = /obj/item/ammo_casing/a12g/pellet
|
||||
|
||||
/obj/item/ammo_magazine/a12g/clip/beanbag
|
||||
name = "ammo clip (12g beanbag)"
|
||||
@@ -219,7 +216,6 @@
|
||||
base_icon_state = "a12-bean"
|
||||
desc = "A color-coded metal clip for holding and quickly loading shotgun shells. This one is loaded with beanbags."
|
||||
ammo_preload = /obj/item/ammo_casing/a12g/beanbag
|
||||
ammo_type = /obj/item/ammo_casing/a12g/beanbag
|
||||
|
||||
/obj/item/ammo_magazine/a12g/clip/silver
|
||||
name = "ammo clip (12g buckshot)"
|
||||
@@ -227,7 +223,6 @@
|
||||
base_icon_state = "a12-silver"
|
||||
desc = "A color-coded metal clip for holding and quickly loading shotgun shells. This one is loaded with silver buckshot."
|
||||
ammo_preload = /obj/item/ammo_casing/a12g/silver
|
||||
ammo_type = /obj/item/ammo_casing/a12g/silver
|
||||
|
||||
//* Magazines - Pouches
|
||||
|
||||
@@ -262,28 +257,23 @@
|
||||
name = "shotgun slug holder (slug)"
|
||||
marking_color = PIPE_COLOR_BLACK
|
||||
ammo_preload = /obj/item/ammo_casing/a12g
|
||||
ammo_type = /obj/item/ammo_casing/a12g
|
||||
|
||||
/obj/item/ammo_magazine/a12g/pouch/full/flare
|
||||
name = "shotgun slug holder (flare)"
|
||||
marking_color = COLOR_RED_GRAY
|
||||
ammo_preload = /obj/item/ammo_casing/a12g/flare
|
||||
ammo_type = /obj/item/ammo_casing/a12g/flare
|
||||
|
||||
/obj/item/ammo_magazine/a12g/pouch/full/buckshot
|
||||
name = "shotgun slug holder (buckshot)"
|
||||
marking_color = COLOR_RED
|
||||
ammo_preload = /obj/item/ammo_casing/a12g/pellet
|
||||
ammo_type = /obj/item/ammo_casing/a12g/pellet
|
||||
|
||||
/obj/item/ammo_magazine/a12g/pouch/full/beanbag
|
||||
name = "shotgun slug holder (beanbag)"
|
||||
marking_color = COLOR_GREEN
|
||||
ammo_preload = /obj/item/ammo_casing/a12g/beanbag
|
||||
ammo_type = /obj/item/ammo_casing/a12g/beanbag
|
||||
|
||||
/obj/item/ammo_magazine/a12g/pouch/full/stun
|
||||
name = "shotgun slug holder (stun)"
|
||||
marking_color = PIPE_COLOR_YELLOW
|
||||
ammo_preload = /obj/item/ammo_casing/a12g/stunshell
|
||||
ammo_type = /obj/item/ammo_casing/a12g/stunshell
|
||||
|
||||
@@ -49,7 +49,6 @@
|
||||
base_icon_state = "normal"
|
||||
ammo_caliber = /datum/ammo_caliber/a357
|
||||
ammo_preload = /obj/item/ammo_casing/a357
|
||||
ammo_type = /obj/item/ammo_casing/a357
|
||||
magazine_type = MAGAZINE_TYPE_SPEEDLOADER
|
||||
ammo_max = 6
|
||||
materials_base = list(MAT_STEEL = 500)
|
||||
@@ -59,7 +58,6 @@
|
||||
icon_state = "holy-6"
|
||||
base_icon_state = "holy"
|
||||
ammo_preload = /obj/item/ammo_casing/a357/silver
|
||||
ammo_type = /obj/item/ammo_casing/a357/silver
|
||||
|
||||
/obj/item/ammo_magazine/a357/speedloader/stun
|
||||
name = "speedloader (.357 stun)"
|
||||
@@ -67,7 +65,6 @@
|
||||
icon_state = "redtip-6"
|
||||
base_icon_state = "redtip"
|
||||
ammo_preload = /obj/item/ammo_casing/a357/stun
|
||||
ammo_type = /obj/item/ammo_casing/a357/stun
|
||||
|
||||
/obj/item/ammo_magazine/a357/speedloader/rubber
|
||||
name = "speedloader (.357 rubber)"
|
||||
@@ -75,7 +72,6 @@
|
||||
icon_state = "bluetip-6"
|
||||
base_icon_state = "bluetip"
|
||||
ammo_preload = /obj/item/ammo_casing/a357/rubber
|
||||
ammo_type = /obj/item/ammo_casing/a357/rubber
|
||||
|
||||
/obj/item/ammo_magazine/a357/speedloader/flash
|
||||
name = "speedloader (.357 flash)"
|
||||
@@ -83,4 +79,3 @@
|
||||
icon_state = "white-6"
|
||||
base_icon_state = "white"
|
||||
ammo_preload = /obj/item/ammo_casing/a357/flash
|
||||
ammo_type = /obj/item/ammo_casing/a357/flash
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
/obj/item/ammo_magazine/a44/rubber
|
||||
desc = "A magazine for .44 less-than-lethal ammo."
|
||||
ammo_type = /obj/item/ammo_casing/a44/rubber
|
||||
ammo_preload = /obj/item/ammo_casing/a44/rubber
|
||||
|
||||
/obj/item/ammo_magazine/a44/clip
|
||||
name = "ammo clip (.44)"
|
||||
|
||||
@@ -47,17 +47,17 @@
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/ap
|
||||
name = "magazine (5.7x28mm armor piercing)"
|
||||
rendering_static_overlay = "ap"
|
||||
rendering_static_overlay = "ntles-ap"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/ap
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/hp
|
||||
name = "magazine (5.7x28mm hollow-point)"
|
||||
rendering_static_overlay = "hp"
|
||||
rendering_static_overlay = "ntles-hp"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hp
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/hunter
|
||||
name = "magazine (5.7x28mm hunter)"
|
||||
rendering_static_overlay = "hunter"
|
||||
rendering_static_overlay = "ntles-hunter"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hunter
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/empty
|
||||
@@ -71,16 +71,16 @@
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/highcap/ap
|
||||
name = "high capacity magazine (5.7x28mm armor piercing)"
|
||||
rendering_static_overlay = "ap"
|
||||
rendering_static_overlay = "ntles-high-ap"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/ap
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/highcap/hp
|
||||
name = "high capacity magazine (5.7x28mm hollow-point)"
|
||||
rendering_static_overlay = "hp"
|
||||
rendering_static_overlay = "ntles-high-hp"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hp
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/highcap/hunter
|
||||
name = "high capacity magazine (5.7x28mm hunter)"
|
||||
rendering_static_overlay = "hunter"
|
||||
rendering_static_overlay = "ntles-high-hunter"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hunter
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/nt_les/highcap/empty
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/harpy_smg/ap
|
||||
name = "NT-SMG-8 magazine (5.7x28mm armor piercing)"
|
||||
rendering_static_overlay = "ap"
|
||||
rendering_static_overlay = "harpy-ap"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/ap
|
||||
|
||||
//Fiveseven mags
|
||||
@@ -118,17 +118,17 @@
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/ap
|
||||
name = "magazine (5.7x28mm armor piercing)"
|
||||
rendering_static_overlay = "ap"
|
||||
rendering_static_overlay = "fiveseven-ap"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/ap
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/hp
|
||||
name = "magazine (5.7x28mm hollow-point)"
|
||||
rendering_static_overlay = "hp"
|
||||
rendering_static_overlay = "fiveseven-hp"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hp
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/hunter
|
||||
name = "magazine (5.7x28mm hunter)"
|
||||
rendering_static_overlay = "hunter"
|
||||
rendering_static_overlay = "fiveseven-hunter"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hunter
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/empty
|
||||
@@ -143,16 +143,16 @@
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/highcap/ap
|
||||
name = "high capacity magazine (5.7x28mm armor piercing)"
|
||||
rendering_static_overlay = "ap"
|
||||
rendering_static_overlay = "fiveseven-high-ap"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/ap
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/highcap/hp
|
||||
name = "high capacity magazine (5.7x28mm hollow-point)"
|
||||
rendering_static_overlay = "hp"
|
||||
rendering_static_overlay = "fiveseven-high-hp"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hp
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/highcap/hunter
|
||||
name = "high capacity magazine (5.7x28mm hunter)"
|
||||
rendering_static_overlay = "hunter"
|
||||
rendering_static_overlay = "fiveseven-high-hunter"
|
||||
ammo_preload = /obj/item/ammo_casing/a5_7mm/hunter
|
||||
|
||||
/obj/item/ammo_magazine/a5_7mm/five_seven/highcap/empty
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
name = "prototype rifle magazine (5mm caseless)"
|
||||
icon_state = "caseless-mag-0"
|
||||
base_icon_state = "caseless-mag"
|
||||
ammo_type = /obj/item/ammo_casing/a5mmcaseless
|
||||
ammo_preload = /obj/item/ammo_casing/a5mmcaseless
|
||||
ammo_caliber = /datum/ammo_caliber/a5mm
|
||||
ammo_max = 30
|
||||
rendering_system = GUN_RENDERING_STATES
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/ammo_magazine/m5mmcaseless/stun
|
||||
icon_state = "caseless-mag-alt-0"
|
||||
base_icon_state = "caseless-mag-alt"
|
||||
ammo_type = /obj/item/ammo_casing/a5mmcaseless/stun
|
||||
ammo_preload = /obj/item/ammo_casing/a5mmcaseless/stun
|
||||
|
||||
//* Ammunition *//
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
icon_state = "stg"
|
||||
|
||||
ammo_caliber = /datum/ammo_caliber/a7_92mm
|
||||
ammo_type = /obj/item/ammo_casing/a792
|
||||
ammo_preload = /obj/item/ammo_casing/a792
|
||||
ammo_max = 30
|
||||
|
||||
/obj/item/ammo_magazine/a7_92mm/empty
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
rendering_count = 1
|
||||
|
||||
ammo_caliber = /datum/ammo_caliber/pellet
|
||||
ammo_type = /obj/item/ammo_casing/p_pellet
|
||||
ammo_preload = /obj/item/ammo_casing/p_pellet
|
||||
magazine_type = MAGAZINE_TYPE_BOX
|
||||
materials_base = list(
|
||||
/datum/material/steel::id = 100,
|
||||
|
||||
@@ -130,7 +130,11 @@
|
||||
var/unstable = 0
|
||||
var/destroyed = 0
|
||||
|
||||
//* Rendering
|
||||
//* Rendering *//
|
||||
|
||||
/// Used instead of base_icon_state for the mob renderer, if this exists.
|
||||
var/base_mob_state
|
||||
|
||||
/// renderer datum we use for world rendering of the gun item itself
|
||||
/// set this in prototype to a path
|
||||
/// if null, we will not perform default rendering/updating of item states.
|
||||
@@ -149,25 +153,26 @@
|
||||
var/datum/gun_mob_renderer/mob_renderer
|
||||
/// for de-duping
|
||||
var/static/list/mob_renderer_store = list()
|
||||
/// base onmob state override so we don't use [base_icon_state] if overridden
|
||||
// todo: impl
|
||||
var/render_mob_base
|
||||
/// render as -wield if we're wielded? applied at the end of our worn state no matter what
|
||||
|
||||
/// render as -wield if we're wielded? applied at the end of our base worn state no matter what
|
||||
///
|
||||
/// todo: impl
|
||||
///
|
||||
/// * ignores [mob_renderer]
|
||||
/// * ignores [render_additional_exclusive] / [render_additional_worn]
|
||||
// todo: impl
|
||||
/// * ordering: [base]-wield-[additional]-[...rest]
|
||||
var/render_mob_wielded = FALSE
|
||||
/// state to add as an append
|
||||
///
|
||||
/// * segment and overlay renders add [base_icon_state]-[append]
|
||||
/// * state renders set state to [base_icon_state]-[append]-[...rest]
|
||||
/// * state renders set state to [base_icon_state]-[wield?]-[append]-[...rest]
|
||||
var/render_additional_state
|
||||
/// only render [render_additional_state]
|
||||
var/render_additional_exclusive = FALSE
|
||||
/// [render_additional_state] and [render_additional_exclusive] apply to worn sprites
|
||||
// todo: impl
|
||||
var/render_additional_worn = FALSE
|
||||
|
||||
/// use the old render system, if item_renderer and mob_renderer are not set
|
||||
// todo: remove
|
||||
var/render_use_legacy_by_default = TRUE
|
||||
@@ -879,6 +884,8 @@
|
||||
|
||||
// PENDING FIREMODE REWORK
|
||||
/obj/item/gun/proc/legacy_get_firemode()
|
||||
if(!length(firemodes) || (sel_mode > length(firemodes)))
|
||||
return
|
||||
return firemodes[sel_mode]
|
||||
|
||||
//* Ammo *//
|
||||
@@ -896,7 +903,8 @@
|
||||
//* Rendering *//
|
||||
|
||||
/obj/item/gun/update_icon(updates)
|
||||
if(!item_renderer && !mob_renderer)
|
||||
// todo: shouldn't need this check, deal with legacy
|
||||
if(!item_renderer && !mob_renderer && render_use_legacy_by_default)
|
||||
return ..()
|
||||
cut_overlays()
|
||||
var/ratio_left = get_ammo_ratio()
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
return
|
||||
var/x = initial_x
|
||||
var/y = initial_y
|
||||
var/append = "[use_firemode && firemode_key && "-[firemode_key]"]"
|
||||
var/append = "[use_firemode && firemode_key ? "-[firemode_key]" : ""]"
|
||||
for(var/i in 1 to ceil(count * ammo_ratio))
|
||||
var/image/creating = image(gun.icon, "[base_icon_state][append]-ammo", null, null, x, y)
|
||||
x += offset_x
|
||||
@@ -132,7 +132,7 @@
|
||||
return
|
||||
if(!ammo_ratio)
|
||||
if(use_empty)
|
||||
gun.icon_state = "[base_icon_state][firemode_key && use_firemode_empty && "-[firemode_key]"]-empty"
|
||||
gun.icon_state = "[base_icon_state][firemode_key && use_firemode_empty ? "-[firemode_key]" : ""]-empty"
|
||||
else
|
||||
gun.icon_state = base_icon_state
|
||||
return
|
||||
@@ -146,3 +146,17 @@
|
||||
*/
|
||||
/datum/gun_item_renderer/states/all_or_nothing
|
||||
count = 1
|
||||
|
||||
/**
|
||||
* just swaps icon state to "-empty"
|
||||
*
|
||||
* * can optionally append a firemode key
|
||||
*/
|
||||
/datum/gun_item_renderer/empty_state
|
||||
|
||||
/datum/gun_item_renderer/empty_state/render(obj/item/gun/gun, ammo_ratio, firemode_key)
|
||||
var/base_icon_state = gun.base_icon_state || initial(gun.icon_state)
|
||||
gun.icon_state = "[base_icon_state][firemode_key && use_firemode ? "-[firemode_key]" : ""][ammo_ratio ? "" : "-empty"]"
|
||||
|
||||
/datum/gun_item_renderer/empty_state/dedupe_key()
|
||||
return "empty_state-[use_firemode]"
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
/datum/gun_mob_renderer/states/render(obj/item/gun/gun, ammo_ratio, firemode_key)
|
||||
// todo: do we really need to always return TRUE and force an update?
|
||||
var/base_icon_state = gun.render_mob_base || gun.base_icon_state || initial(gun.icon_state)
|
||||
var/base_icon_state = gun.base_mob_state || gun.base_icon_state || initial(gun.icon_state)
|
||||
if(!ammo_ratio)
|
||||
if(empty_state)
|
||||
gun.inhand_state = "[base_icon_state][firemode_key && use_firemode && "-[firemode_key]"]-empty"
|
||||
|
||||
@@ -17,6 +17,32 @@
|
||||
/// If set, accepts ammo and magazines of this caliber.
|
||||
var/caliber = /datum/ammo_caliber/a357
|
||||
|
||||
//* Rendering *//
|
||||
|
||||
/// Render an overlay when magazine is in.
|
||||
///
|
||||
/// todo: mob renderer integration
|
||||
///
|
||||
/// * This uses MAGAZINE_CLASS_* defines
|
||||
/// * We'll look for a matching class that we support to render
|
||||
/// * If we can't find one, we'll use any class that we have on ourselves
|
||||
var/render_magazine_overlay = NONE
|
||||
/// Render the chamber state.
|
||||
///
|
||||
/// todo: mob renderer integration
|
||||
/// todo: this is not supported yet
|
||||
///
|
||||
/// * uses BALLISTIC_RENDER_BOLT_* enms
|
||||
var/render_bolt_overlay = BALLISTIC_RENDER_BOLT_NEVER
|
||||
/// Render the state of a gun that's 'break action'
|
||||
///
|
||||
/// todo: mob renderer integration
|
||||
/// todo: this is not supported yet
|
||||
///
|
||||
/// * uses BALLISTIC_RENDER_BREAK_* enums
|
||||
/// * This is also used for LMGs, and any other gun requiring this stuff.
|
||||
var/render_break_overlay = BALLISTIC_RENDER_BREAK_NEVER
|
||||
|
||||
//! LEGACY BELOW
|
||||
|
||||
var/handle_casings = EJECT_CASINGS //determines how spent casings should be handled
|
||||
@@ -111,7 +137,8 @@
|
||||
qdel(chambered)
|
||||
return
|
||||
else
|
||||
chambered.loc = get_turf(src)
|
||||
chambered.forceMove(get_turf(src))
|
||||
chambered.randomize_offsets_after_eject()
|
||||
playsound(src.loc, "casing", 50, 1)
|
||||
if(CYCLE_CASINGS) //cycle the casing back to the end.
|
||||
if(ammo_magazine)
|
||||
@@ -366,3 +393,30 @@
|
||||
var/datum/ammo_caliber/ours = resolve_caliber(caliber)
|
||||
var/datum/ammo_caliber/theirs = resolve_caliber(caliberlike)
|
||||
return ours.equivalent(theirs)
|
||||
|
||||
//* Rendering *//
|
||||
|
||||
/**
|
||||
* Returns an overlay for a magazine. This can be a string, or anything else that goes into our 'overlays' list.
|
||||
*/
|
||||
/obj/item/gun/ballistic/proc/get_magazine_overlay_for(obj/item/ammo_magazine/magazine)
|
||||
var/effective_magazine_class = magazine.magazine_class
|
||||
if(!(effective_magazine_class & render_magazine_overlay))
|
||||
if(render_magazine_overlay & MAGAZINE_CLASS_GENERIC)
|
||||
effective_magazine_class = MAGAZINE_CLASS_GENERIC
|
||||
else
|
||||
return
|
||||
return global.magazine_class_bit_to_state[log(2, magazine.magazine_class) + 1]
|
||||
|
||||
/obj/item/gun/ballistic/update_icon()
|
||||
// todo: shouldn't need this check, deal with legacy
|
||||
if(!item_renderer && !mob_renderer && render_use_legacy_by_default)
|
||||
return ..()
|
||||
. = ..()
|
||||
// todo: render_break_overlay
|
||||
// todo: render_bolt_overlay
|
||||
if(render_magazine_overlay)
|
||||
if(ammo_magazine)
|
||||
var/overlay = get_magazine_overlay_for(ammo_magazine)
|
||||
if(overlay)
|
||||
add_overlay(overlay)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
desc = "A nanite fabrication magazine for the \'AML'"
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
|
||||
description_info = "This magazine holds self-charging nanite fabricators to power the AML 'Medigun'. Up to three can be loaded at once, and each provides four shots of their respective healing type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger."
|
||||
ammo_type = /obj/item/ammo_casing/microbattery/medical
|
||||
ammo_restrict = /obj/item/ammo_casing/microbattery/medical
|
||||
icon_state = "ml3m_mag"
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3)
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
icon_state = "cell_mag"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_MAGNETS = 3)
|
||||
ammo_caliber = /datum/ammo_caliber/microbattery
|
||||
ammo_type = /obj/item/ammo_casing/microbattery
|
||||
ammo_max = 3
|
||||
ammo_current = 0
|
||||
ammo_legacy_init_everything = TRUE
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
x_offset = 4
|
||||
catalogue_data = null//list(/datum/category_item/catalogue/information/organization/nanotrasen)
|
||||
description_info = "This magazine holds Hydra microbatteries to power the Hydra handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger."
|
||||
ammo_type = /obj/item/ammo_casing/microbattery/combat
|
||||
ammo_restrict = /obj/item/ammo_casing/microbattery/combat
|
||||
|
||||
/obj/item/ammo_magazine/microbattery/combat/prototype
|
||||
name = "prototype microbattery magazine"
|
||||
|
||||
|
After Width: | Height: | Size: 468 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 379 B |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 967 B |
|
After Width: | Height: | Size: 728 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1005 B |
|
After Width: | Height: | Size: 900 B |