Merge branch 'master' into od_pragmas

This commit is contained in:
Selis
2025-02-24 23:27:59 +01:00
committed by GitHub
37 changed files with 284 additions and 63 deletions
+13 -1
View File
@@ -15,10 +15,22 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Generate App Token
id: app-token-generation
uses: actions/create-github-app-token@v1
if: env.APP_PRIVATE_KEY != '' && env.APP_ID != ''
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
env:
APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
APP_ID: ${{ secrets.APP_ID }}
- name: Run auto changelog
uses: actions/github-script@v7
with:
script: |
const { processAutoChangelog } = await import('${{ github.workspace }}/tools/pull_request_hooks/autoChangelog.js')
await processAutoChangelog({ github, context })
github-token: ${{ secrets.COMFY_ORANGE_PAT || secrets.GITHUB_TOKEN }}
github-token: ${{ steps.app-token-generation.outputs.token || secrets.GITHUB_TOKEN }}
+20 -3
View File
@@ -18,37 +18,54 @@ jobs:
# unset SECRET_EXISTS
# if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi
# echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT
- name: "Setup python"
#if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: "Install deps"
#if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
python -m pip install --upgrade pip
python -m pip install pyyaml
sudo apt-get install dos2unix
- name: "Checkout"
#if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: actions/checkout@v4
with:
fetch-depth: 25
persist-credentials: false
- name: "Compile"
#if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
python tools/ss13_genchangelog.py html/changelogs
- name: Commit
#if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
git config --local user.email "action@github.com"
git config --local user.name "Changelogs"
git config --local user.name "vorestation-ci[bot]"
git config --local user.email "199609141+vorestation-ci[bot]@users.noreply.github.com"
git pull origin master
git add html/changelogs
git commit -m "Automatic changelog compile [ci skip]" -a || true
- name: Generate App Token
id: app-token-generation
uses: actions/create-github-app-token@v1
if: env.APP_PRIVATE_KEY != '' && env.APP_ID != ''
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
env:
APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
APP_ID: ${{ secrets.APP_ID }}
- name: "Push"
#if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.COMFY_ORANGE_PAT || secrets.GITHUB_TOKEN }}
github_token: ${{ steps.app-token-generation.outputs.token || secrets.GITHUB_TOKEN }}
+1
View File
@@ -4,4 +4,5 @@ GLOBAL_REAL(config, /datum/controller/configuration) = new
GLOBAL_DATUM_INIT(revdata, /datum/getrev, new)
GLOBAL_VAR_INIT(game_version, "VOREStation")
GLOBAL_VAR_INIT(changelog_hash, "")
+4 -4
View File
@@ -22,14 +22,14 @@
/datum/component/orbiter/RegisterWithParent()
. = ..()
var/atom/target = parent
while(ismovable(target))
if(ismovable(target))
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(move_react))
target = target.loc
/datum/component/orbiter/UnregisterFromParent()
. = ..()
var/atom/target = parent
while(ismovable(target))
if(ismovable(target))
UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
target = target.loc
@@ -119,12 +119,12 @@
// These are prety rarely activated, how often are you following something in a bag?
if(oldloc && !isturf(oldloc)) // We used to be registered to it, probably
var/atom/target = oldloc
while(ismovable(target))
if(ismovable(target))
UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
target = target.loc
if(orbited?.loc && orbited.loc != newturf) // We want to know when anything holding us moves too
var/atom/target = orbited.loc
while(ismovable(target))
if(ismovable(target))
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(move_react), TRUE)
target = target.loc
@@ -1,6 +1,6 @@
/obj/item/healthanalyzer/verb/toggle_guide()
set name = "Toggle Guidance"
set desc = "Toggles whether or not \the [src] will provide guidance and instruction in addition to scanning."
set desc = "Toggles whether or not the health analyzer will provide guidance and instruction in addition to scanning."
set category = "Object"
guide = !guide
to_chat(usr, span_notice("You toggle \the [src]'s guidance system [guide ? "on" : "off"]."))
+3 -1
View File
@@ -8,8 +8,10 @@
var/falling_type = /obj/item/reagent_containers/food/snacks/sliceable/pizza/margherita
var/crushing = TRUE
/obj/effect/falling_effect/Initialize(mapload, type)
/obj/effect/falling_effect/Initialize(mapload, type, var/crushing_type)
..()
if(!isnull(crushing_type))
crushing = crushing_type
if(type)
falling_type = type
return INITIALIZE_HINT_LATELOAD
+18
View File
@@ -1,4 +1,5 @@
//For bypassing locked /obj/structure/simple_doors
//now with added fence gate support
/obj/item/lockpick
name = "set of lockpicks"
@@ -30,6 +31,23 @@
if(do_after(user, pick_time * D.lock_difficulty))
to_chat(user, span_notice("Success!"))
D.locked = FALSE
if(istype(A, /obj/structure/fence/door))
var/obj/structure/fence/door/D = A
if(!D.locked) //you can pick your nose, but you can't pick an unlocked door
to_chat(user, span_notice("\The [D] isn't locked."))
return
else if(D.lock_type != pick_type) //make sure our types match
to_chat(user, span_warning("\The [src] can't pick \the [D]. Another tool might work?"))
return
else if(!D.can_pick) //make sure we're actually allowed to bypass it at all
to_chat(user, span_warning("\The [D] can't be [pick_verb]ed."))
return
else //finally, we can assume that they do match
to_chat(user, span_notice("You start to [pick_verb] the lock on \the [D]..."))
playsound(src, D.keysound,100, 1)
if(do_after(user, pick_time * D.lock_difficulty))
to_chat(user, span_notice("Success!"))
D.locked = FALSE
else if(ishuman(A)) //you can pick your friends, and you can pick your nose, but you can't pick your friend's nose
var/mob/living/carbon/human/H = A
if(user.zone_sel.selecting == BP_HEAD)
+1
View File
@@ -269,6 +269,7 @@
prob(1);/obj/item/beartrap,
prob(1);/obj/item/handcuffs,
prob(1);/obj/item/handcuffs/legcuffs,
prob(1);/obj/item/lockpick,
prob(2);/obj/item/reagent_containers/syringe/drugs,
prob(1);/obj/item/reagent_containers/syringe/steroid)
+1
View File
@@ -71,6 +71,7 @@
/obj/item/canvas/Initialize()
. = ..()
reset_grid()
desc += " (Canvas size is [width]x[height].)"
/obj/item/canvas/proc/reset_grid()
grid = new/list(width,height)
+23
View File
@@ -69,6 +69,7 @@
return ..()
/obj/structure/fence/attackby(obj/item/W, mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(W.has_tool_quality(TOOL_WIRECUTTER))
if(!cuttable)
to_chat(user, span_warning("This section of the fence can't be cut."))
@@ -122,6 +123,11 @@
cuttable = FALSE
var/open = FALSE
var/locked = FALSE
var/lock_id = null //does the door have an associated key?
var/lock_type = "simple" //string matched to "pick_type" on /obj/item/lockpick
var/can_pick = TRUE //can it be picked/bypassed?
var/lock_difficulty = 1 //multiplier to picking/bypassing time
var/keysound = 'sound/items/toolbelt_equip.ogg'
/obj/structure/fence/door/Initialize()
update_door_status()
@@ -144,6 +150,23 @@
return TRUE
/obj/structure/fence/door/attackby(obj/item/W as obj, mob/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(istype(W,/obj/item/simple_key))
var/obj/item/simple_key/key = W
if(open)
to_chat(user,span_notice("\The [src] must be closed in order for you to lock it."))
else if(key.key_id != src.lock_id)
to_chat(user,span_warning("The [key] doesn't fit \the [src]'s lock!"))
else if(key.key_id == src.lock_id)
visible_message(span_notice("[user] [key.keyverb] \the [key] and [locked ? "unlocks" : "locks"] \the [src]."))
locked = !locked
playsound(src, keysound,100, 1)
return
else
attack_hand(user)
return
/obj/structure/fence/door/proc/toggle(mob/user)
switch(open)
if(FALSE)
+2 -2
View File
@@ -130,7 +130,7 @@ var/world_topic_spam_protect_time = world.timeofday
else if (copytext(T,1,7) == "status")
var/input[] = params2list(T)
var/list/s = list()
s["version"] = game_version
s["version"] = GLOB.game_version
s["mode"] = master_mode
s["respawn"] = CONFIG_GET(flag/abandon_allowed)
s["persistance"] = CONFIG_GET(flag/persistence_disabled)
@@ -559,7 +559,7 @@ var/world_topic_spam_protect_time = world.timeofday
s += span_bold("[station_name()]");
s += " ("
s += "<a href=\"https://\">" //Change this to wherever you want the hub to link to.
// s += "[game_version]"
// s += "[GLOB.game_version]"
s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version.
s += "</a>"
s += ")"
-1
View File
@@ -31,7 +31,6 @@ var/href_logfile = null
// var/const/company_short = "NT"
// var/const/star_name = "Vir"
// var/const/starsys_name = "Vir"
var/const/game_version = "VOREStation"
var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 300) //VOREStation Edit
var/round_progressing = 1
+2 -4
View File
@@ -658,12 +658,10 @@
return
if(pa.Find("left") && !pa.Find("ctrl"))
if(ispath(holder.buildmode.objholder))
var/obj/effect/falling_effect/FE = new /obj/effect/falling_effect(get_turf(object), holder.buildmode.objholder)
FE.crushing = FALSE
new /obj/effect/falling_effect(get_turf(object), holder.buildmode.objholder, FALSE)
else if(pa.Find("right"))
if(ispath(holder.buildmode.objholder))
var/obj/effect/falling_effect/FE = new /obj/effect/falling_effect(get_turf(object), holder.buildmode.objholder)
FE.crushing = TRUE
new /obj/effect/falling_effect(get_turf(object), holder.buildmode.objholder, TRUE)
else if(pa.Find("ctrl"))
holder.buildmode.objholder = object.type
to_chat(user, span_notice("[object]([object.type]) copied to buildmode."))
+2 -2
View File
@@ -2903,7 +2903,7 @@
acronym = "SAARE"
desc = "SAARE consistently have the worst reputation of any paramilitary group. This is because they specialize in deniability and secrecy. Although publically they work in asset recovery, they have a substantiated reputation for info-theft and piracy that has lead to them butting heads with the law on more than one occasion. Nonetheless, they are an invaluable part of the Solar economy, and other TSCs and small colonial governments keep them in business.\
<br><br>\
For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (<i>e.g.</i> 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command \& Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics."
For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (<i>e.g.</i> 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command & Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics."
history = ""
work = "mercenary contractors"
headquarters = ""
@@ -3005,4 +3005,4 @@
i--
//ex: "Phalanx One-Niner", "Sledgehammer Actual" (CO/VIP), "Kodiak Seven-Four", "Tomahawk Two-Zero"
//probably a more elegant (read: fancier) way to do the second part but fuck it, this works just fine
//probably a more elegant (read: fancier) way to do the second part but fuck it, this works just fine
@@ -316,3 +316,8 @@ modular computers
display_name = "podzu music player"
path = /obj/item/walkpod
cost = 2
/datum/gear/utility/bloodbag //For your vampiric crew!
display_name = "blood bag (Randomized)"
path = /obj/item/reagent_containers/blood/random_bloodsucker
cost = 1
@@ -198,7 +198,7 @@
/obj/item/clothing/head/helmet/space/void/aether/verb/select_color()
set name = "Helmet Color"
set desc = "Change the color of [src]"
set desc = "Change the color of the helmet"
set category = "Object"
var/choice = tgui_input_list(usr, "Select a new color:", "[src] Color", list("White", "Blue", "Purple", "Yellow", "Red", "Green"))
+11
View File
@@ -236,6 +236,17 @@
if(prob(mutchance))
yield_mod = min(10,yield_mod+rand(1,2))
return
else if(istype(Proj, /obj/item/projectile/energy/floraprune))
var/obj/item/projectile/energy/floraprune/GP = Proj
mutchance *= GP.lasermod
if(prob(mutchance) && seed)
var/c = safepick(seed.chems)
if(length(seed.chems) > 1 && c)
var/turf/T = get_turf(loc)
seed = seed.diverge()
T.visible_message(span_infoplain(span_bold("\The [seed.display_name]") + " quivers!"))
seed.chems -= c
return
..()
+1
View File
@@ -5,6 +5,7 @@
desc = "to paint your nails with. Or someone else's!"
icon = 'icons/obj/nailpolish_vr.dmi'
icon_state = "nailpolish"
w_class = ITEMSIZE_SMALL
var/colour = "#FFFFFF"
var/image/top_underlay
var/image/color_underlay
+2 -1
View File
@@ -645,7 +645,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, span_filter_notice(span_red("You are dead! You have no mind to store memory!")))
/mob/observer/dead/Post_Incorpmove()
stop_following()
if(following) //This wasn't here before. It meant that we would do stop_following repeatedly every movement we made...Resulting in a DOS on our client.
stop_following()
/mob/observer/dead/verb/analyze_air()
set name = "Analyze Air"
@@ -404,7 +404,7 @@
/mob/living/carbon/human/proc/alraune_fruit_pick()
set name = "Pick Fruit"
set desc = "Pick fruit off of [src]."
set desc = "Pick fruit off of the fruit gland."
set category = "Object"
set src in view(1)
@@ -322,7 +322,7 @@
if(!destinations.len)
to_chat(src, span_warning("There is nowhere nearby to land! You need to get closer to somewhere else that you can transition to before you can transition."))
return
for(var/obj/effect/landmark/stardog/l in destinations)
//for(var/obj/effect/landmark/stardog/l in destinations)
var/obj/effect/overmap/visitable/our_dest = tgui_input_list(src, "Where would you like to try to go?", "Transition", destinations, timeout = 15 SECONDS, strict_modern = TRUE)
if(!our_dest)
to_chat(src, span_warning("You decide not to transition."))
@@ -11,6 +11,7 @@
. = ..()
add_verb(src, /mob/living/simple_mob/proc/set_name)
add_verb(src, /mob/living/simple_mob/proc/set_desc)
add_verb(src, /mob/living/simple_mob/proc/set_gender)
if(copy_prefs_to_mob)
login_prefs()
@@ -73,5 +74,14 @@
if(newdesc)
desc = newdesc
/mob/living/simple_mob/proc/set_gender()
set name = "Set Gender"
set desc = "Set your gender."
set category = "Abilities.Settings"
var/newgender
newgender = tgui_input_list(src, "Please select a gender:", "Set Gender", list(FEMALE, MALE, NEUTER, PLURAL))
if(newgender)
gender = newgender
/mob/living/simple_mob/vore/aggressive
mob_bump_flag = HEAVY
+2
View File
@@ -68,7 +68,9 @@
if(!docking_codes)
docking_codes = "[ascii2text(rand(65,90))][ascii2text(rand(65,90))][ascii2text(rand(65,90))][ascii2text(rand(65,90))]"
#ifdef TESTING
testing("Located sector \"[name]\" at [start_x],[start_y], containing Z [english_list(map_z)]")
#endif
LAZYADD(SSshuttles.sectors_to_initialize, src) //Queued for further init. Will populate the waypoint lists; waypoints not spawned yet will be added in as they spawn.
SSshuttles.process_init_queues()
@@ -17,8 +17,7 @@ var/list/fusion_reactions
/proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy)
if(!fusion_reactions)
fusion_reactions = list()
for(var/rtype in subtypesof(/decl/fusion_reaction)
)
for(var/rtype in subtypesof(/decl/fusion_reaction))
var/decl/fusion_reaction/cur_reaction = new rtype()
if(!fusion_reactions[cur_reaction.p_react])
fusion_reactions[cur_reaction.p_react] = list()
@@ -56,6 +56,7 @@
list(mode_name="induce mutations", projectile_type=/obj/item/projectile/energy/floramut, modifystate="floramut"),
list(mode_name="increase yield", projectile_type=/obj/item/projectile/energy/florayield, modifystate="florayield"),
list(mode_name="induce specific mutations", projectile_type=/obj/item/projectile/energy/floramut/gene, modifystate="floramut"),
list(mode_name="prune reagents", projectile_type=/obj/item/projectile/energy/floraprune, modifystate="floramut"),
)
/obj/item/gun/energy/floragun/Initialize()
@@ -121,6 +122,7 @@
var/obj/item/projectile/energy/floramut/gene/G = .
var/obj/item/projectile/energy/florayield/GY = .
var/obj/item/projectile/energy/floramut/GM = .
var/obj/item/projectile/energy/floraprune/GP = .
// Inserting the upgrade level of the gun to the projectile as there isn't a better way to do this.
if(istype(G))
G.gene = gene
@@ -129,6 +131,8 @@
GY.lasermod = emitter.rating
else if(istype(GM))
GM.lasermod = emitter.rating
else if(istype(GP))
GP.lasermod = emitter.rating
/obj/item/gun/energy/meteorgun
name = "meteor gun"
@@ -221,6 +221,32 @@
else
return 1
/obj/item/projectile/energy/floraprune
name = "delta somatoray"
icon_state = "energy2"
fire_sound = 'sound/effects/stealthoff.ogg'
damage = 0
damage_type = TOX
nodamage = 1
check_armour = "energy"
light_range = 2
light_power = 0.5
light_color = "#FFFFFF"
impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser
var/lasermod = 0
hud_state = "electrothermal"
/obj/item/projectile/energy/floraprune/on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
if(ishuman(target)) //Make plantpeople thin, seeing as we're removing reagents from actual plants
var/mob/living/carbon/human/H = M
if((H.species.flags & IS_PLANT) && (M.nutrition > 30))
M.adjust_nutrition(-30)
else if (istype(target, /mob/living/carbon/))
M.show_message(span_blue("The radiation beam dissipates harmlessly through your body."))
else
return 1
/obj/item/projectile/beam/mindflayer
name = "flayer ray"
@@ -27,7 +27,9 @@
if (CELL_ALIVE(map[tmp_cell]))
ore_turfs += tmp_cell
#ifdef TESTING
testing("ASGEN: Found [ore_turfs.len] ore turfs.")
#endif
var/ore_count = round(map.len/20)
var/door_count = 0
var/empty_count = 0
@@ -46,8 +48,10 @@
empty_count += 1
ore_count--
#ifdef TESTING
testing("ASGEN: Set [door_count] turfs to random minerals.")
testing("ASGEN: Set [empty_count] turfs to high-chance random minerals.")
#endif
return 1
/datum/random_map/automata/cave_system/apply_to_turf(var/x,var/y)
@@ -1,17 +1,38 @@
/obj/item/reagent_containers/chem_disp_cartridge
//Xenoflora
ammonia spawn_reagent = REAGENT_ID_AMMONIA
diethylamine spawn_reagent = REAGENT_ID_DIETHYLAMINE
plantbgone spawn_reagent = REAGENT_ID_PLANTBGONE
mutagen spawn_reagent = REAGENT_ID_MUTAGEN
//Xenoflora
//Biochem
nutriment spawn_reagent = REAGENT_ID_NUTRIMENT
protein spawn_reagent = REAGENT_ID_PROTEIN
/obj/item/reagent_containers/chem_disp_cartridge/ammonia
spawn_reagent = REAGENT_ID_AMMONIA
//Special Ops
biomass spawn_reagent = REAGENT_ID_BIOMASS
carthatoline spawn_reagent = REAGENT_ID_CARTHATOLINE
corophizine spawn_reagent = REAGENT_ID_COROPHIZINE
myelamine spawn_reagent = REAGENT_ID_MYELAMINE
osteodaxon spawn_reagent = REAGENT_ID_OSTEODAXON
/obj/item/reagent_containers/chem_disp_cartridge/diethylamine
spawn_reagent = REAGENT_ID_DIETHYLAMINE
/obj/item/reagent_containers/chem_disp_cartridge/plantbgone
spawn_reagent = REAGENT_ID_PLANTBGONE
/obj/item/reagent_containers/chem_disp_cartridge/mutagen
spawn_reagent = REAGENT_ID_MUTAGEN
//Biochem
/obj/item/reagent_containers/chem_disp_cartridge/nutriment
spawn_reagent = REAGENT_ID_NUTRIMENT
/obj/item/reagent_containers/chem_disp_cartridge/protein
spawn_reagent = REAGENT_ID_PROTEIN
//Special Ops
/obj/item/reagent_containers/chem_disp_cartridge/biomass
spawn_reagent = REAGENT_ID_BIOMASS
/obj/item/reagent_containers/chem_disp_cartridge/carthatoline
spawn_reagent = REAGENT_ID_CARTHATOLINE
/obj/item/reagent_containers/chem_disp_cartridge/corophizine
spawn_reagent = REAGENT_ID_COROPHIZINE
/obj/item/reagent_containers/chem_disp_cartridge/myelamine
spawn_reagent = REAGENT_ID_MYELAMINE
/obj/item/reagent_containers/chem_disp_cartridge/osteodaxon
spawn_reagent = REAGENT_ID_OSTEODAXON
@@ -109,3 +109,11 @@
desc = "Seems pretty useless... Maybe if there were a way to fill it?"
icon_state = "empty"
item_state = "bloodpack_empty"
/obj/item/reagent_containers/blood/random_bloodsucker
name = "Ration BloodPack"
desc = "A standard issue BloodPack Ration given to crew that require blood to be sustained!"
/obj/item/reagent_containers/blood/random_bloodsucker/Initialize()
blood_type = pick("A+", "A-", "B+", "B-", "O-", "O+", "AB+", "AB-")
. = ..()
+11 -12
View File
@@ -12,8 +12,7 @@
Articles:
- <http://en.wikipedia.org/wiki/Abstract_syntax_tree>
*/
var
const
/*
Constants: Operator Precedence
OOP_OR - Logical or
@@ -27,16 +26,16 @@ var
OOP_UNARY - Unary Operators
OOP_GROUP - Parentheses
*/
OOP_OR = 1 //||
OOP_AND = OOP_OR + 1 //&&
OOP_BIT = OOP_AND + 1 //&, |
OOP_EQUAL = OOP_BIT + 1 //==, !=
OOP_COMPARE = OOP_EQUAL + 1 //>, <, >=, <=
OOP_ADD = OOP_COMPARE + 1 //+, -
OOP_MULTIPLY= OOP_ADD + 1 //*, /, %
OOP_POW = OOP_MULTIPLY+ 1 //^
OOP_UNARY = OOP_POW + 1 //!
OOP_GROUP = OOP_UNARY + 1 //()
var/const/OOP_OR = 1 // ||
var/const/OOP_AND = OOP_OR + 1 // &&
var/const/OOP_BIT = OOP_AND + 1 // &, |
var/const/OOP_EQUAL = OOP_BIT + 1 // ==, !=
var/const/OOP_COMPARE = OOP_EQUAL + 1 // >, <, >=, <=
var/const/OOP_ADD = OOP_COMPARE + 1 // +, -
var/const/OOP_MULTIPLY= OOP_ADD + 1 // *, /, %
var/const/OOP_POW = OOP_MULTIPLY + 1 // ^
var/const/OOP_UNARY = OOP_POW + 1 // !
var/const/OOP_GROUP = OOP_UNARY + 1 // ()
/*
Class: node
@@ -130,4 +130,8 @@
if(type == "entry" || type == "force")
handle_entry(type, payload)
return TRUE
if(type == "lenwarn")
var/mlen = payload["length"]
var/maxlen = payload["maxlength"]
to_chat(client, span_warning(span_bold("Warning") + ": Message with [mlen] exceeded the maximum length of [maxlen]."))
return FALSE
+44
View File
@@ -0,0 +1,44 @@
2025-02-15:
ItsSelis:
- rscadd: Automatic changelog generation & compilation
- code_imp: Changelog buttons now pointing to the autochangelogs instead of opening
the wiki
2025-02-18:
ItsSelis:
- refactor: moved one global var to a managed global (to test the workflow change)
Kashargul:
- qol: prevents too long messages from being sent in tgui say
2025-02-19:
TheGreatKitsune:
- qol: Adds text to art canvas descriptions indicating their size
2025-02-20:
TheGreatKitsune:
- rscadd: Add a button to set gender of simplemobs
2025-02-21:
Cameron-The-Raven:
- bugfix: build mode dropped items will no longer always gib
KillianKirilenko:
- rscadd: lockpick sets can now be found as part of the contraband pool in maint
items (useless on station though)
- rscadd: lockpick sets can now be used to pick fence gates as well
- image: resprited the basic lockpick set
2025-02-22:
NickBelmont:
- rscadd: Reagent-removing 'Pruning mode' to the floral somatoray
Tost:
- qol: Changed nail polish's size to small
- code_imp: Added w_class = ITEMSIZE_SMALL to nail polish, which was missing originally.
2025-02-23:
Cameron-The-Raven:
- bugfix: Snake tail no longer has a stray white void pixel following you 24/7 when
facing south
- bugfix: pizza vouchers will no longer land with such speed that they gib any user,
even if not emagged.
- bugfix: no more crashing as a ghost
2025-02-24:
Cameron-The-Raven:
- rscadd: Vampiric crew now have a source of nutrition in the loadout under the
Utility tab!
ItsSelis:
- code_imp: disabled some testing logs by default (now require -DTESTING to be set
while compiling)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 725 B

After

Width:  |  Height:  |  Size: 669 B

+2 -2
View File
@@ -5,8 +5,8 @@
/* FOR LIVE SERVER */
/*********************/
//#define USE_MAP_TETHER
#define USE_MAP_STELLARDELIGHT
#define USE_MAP_TETHER
//#define USE_MAP_STELLARDELIGHT
//#define USE_MAP_GROUNDBASE
// Debug
+15 -8
View File
@@ -51,7 +51,7 @@ export function TguiSay() {
keyof typeof RADIO_PREFIXES | null
>(null);
const [size, setSize] = useState(WindowSize.Small);
const [maxLength, setMaxLength] = useState(1024);
const [maxLength, setMaxLength] = useState(4096);
const [minimumHeight, setMinimumHeight] = useState(WindowSize.Small);
const [minimumWidth, setMinimumWidth] = useState(WindowSize.Width);
const [lightMode, setLightMode] = useState(false);
@@ -117,14 +117,21 @@ export function TguiSay() {
const iterator = channelIterator.current;
const prefix = currentPrefix ?? '';
if (value?.length && value.length < maxLength) {
chatHistory.current.add(value);
Byond.sendMessage('entry', {
channel: iterator.current(),
entry: iterator.isSay() ? prefix + value : value,
});
if (value?.length) {
if (value.length < maxLength) {
chatHistory.current.add(value);
Byond.sendMessage('entry', {
channel: iterator.current(),
entry: iterator.isSay() ? prefix + value : value,
});
} else {
Byond.sendMessage('lenwarn', {
length: value.length,
maxlength: maxLength,
});
return;
}
}
handleClose();
}
+4 -1
View File
@@ -42,7 +42,7 @@ function parseChangelogBody(lines, openTag) {
const entry = CHANGELOG_KEYS_TO_ENTRY[type] || CHANGELOG_KEYS_TO_ENTRY["rscadd"];
if (entry.placeholders.includes(description)) {
if (!entry || entry.placeholders.includes(description)) {
continue;
}
@@ -64,6 +64,9 @@ function parseChangelogBody(lines, openTag) {
}
export function parseChangelog(text) {
if(text == null) {
return undefined;
}
const lines = text.split("\n").map((line) => line.trim());
for (let index = 0; index < lines.length; index++) {