12 Commits

Author SHA1 Message Date
silicons
028c37002c Merge e84f6bcff4 into 42689bc40e 2024-10-19 08:13:36 -07:00
Lohikar
42689bc40e Z-Mimic: Speculative fixes for glass turfs (#6794)
There's still some update ordering issues that seem connected to
lighting, but I'm not sure if this is actually an issue with ZM/O7L
itself or seeker having a moment.
Also fixes some issues with new atom notifications in ZM not working
with recursive mimic properly.
2024-10-19 08:13:25 -07:00
AlphaM01
51065a524e Exploration Mapping Tweaks (#6797)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request
Slight amounts of map housekeeping regarding the exploration department.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game
Things being wrong is bad.
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
del: Deleted mapped-in binoculars spawns for exploration, as they are
now included in explo-related job lockers via code per #6796
del: Removed a toxin treatment pouch from Atlas Explo Shuttle.
add: Gave SAR & Explorers some Hand Labelers on both Atlas and Triumph.
tweak: Touched up some of the erroneous or incomplete floor markings in
Atlas exploration.
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2024-10-15 14:32:16 -07:00
GySgtMurphy
97c4cefd11 Nsv victory final stages (#6796)
Co-authored-by: AlphaM01 <AlphaaMachh@gmail.com>
2024-10-15 20:57:57 +02:00
CharlesWedge
8b40c298bf Halloween Week 2: Ghosts in the Geiger Counter (#6785) 2024-10-14 16:38:12 +02:00
LordME
3f2e19eddd fixes the victory elevator (#6793) 2024-10-14 16:37:40 +02:00
silicons
7678e98fa0 nt expeditionary weapons (#6682) 2024-10-14 16:32:21 +02:00
LordME
ad098d4984 Reorient the victory's decks to make the deck numbers make sense (#6792)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
tweak: The victory map now uses the correct order of decks
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

---------

Co-authored-by: GySgtMurphy <tmiliusis1@gmail.com>
Co-authored-by: GySgtMurphy <79298976+GySgtMurphy@users.noreply.github.com>
Co-authored-by: Niezann <madarauchiha66612@gmail.com>
Co-authored-by: Shikarasu <washikarasu@hotmail.com>
Co-authored-by: silicons <2003111+silicons@users.noreply.github.com>
Co-authored-by: AlphaM01 <AlphaaMachh@gmail.com>
2024-10-13 17:15:15 +01:00
Timothy Teakettle
75cb94ac7f adds a vv option to offer a mob to ghosts to take control of (#6767) 2024-10-13 13:43:49 +02:00
silicons
65f1d3550e refactors simple_networks (#6768) 2024-10-12 23:37:03 +02:00
CharlesWedge
ef39646552 Fixes Ranged Roach Attack Speed (#6779) 2024-10-12 23:36:36 +02:00
GySgtMurphy
e956d74639 Victory branch (#6789)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

God, please work.


## Why It's Good For The Game

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
add: Added new mechanics or gameplay changes
add: Added more things
del: Removed old things

/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

---------

Co-authored-by: Niezann <madarauchiha66612@gmail.com>
Co-authored-by: Shikarasu <washikarasu@hotmail.com>
Co-authored-by: silicons <2003111+silicons@users.noreply.github.com>
2024-10-12 14:32:36 -07:00
134 changed files with 226095 additions and 202623 deletions

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 *//

View File

@@ -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",
)

View 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

View File

@@ -0,0 +1 @@
#define ROLE_GHOST "ghost"

View File

@@ -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

View File

@@ -583,3 +583,4 @@
hear |= recursive_mob_check(A, hear, 3, 1, 0, 1)
return hear

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View 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 ..()

View File

@@ -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>"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View File

@@ -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()

View 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"

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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,
)

View File

@@ -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

View File

@@ -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

View File

@@ -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?

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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{

View File

@@ -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 \

View File

@@ -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

View File

@@ -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

View File

@@ -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])."

View File

@@ -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

View File

@@ -1,3 +1,5 @@
// todo: we need a new feedback system
/datum/feedback_variable
var/variable
var/value

View File

@@ -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()

View File

@@ -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,

View File

@@ -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,

View File

@@ -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))

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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,

View File

@@ -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

View 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.

View 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])")

View File

@@ -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,\

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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
/**

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)])")

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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 ..()

View File

@@ -1,2 +0,0 @@
/datum/proc/RegisterSimpleNetwork(id)
AddElement(/datum/element/simple_network, id)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)"

View File

@@ -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

View File

@@ -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 *//

View File

@@ -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

View File

@@ -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,

View File

@@ -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()

View File

@@ -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]"

View File

@@ -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"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 900 B

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