



graphics_threaded.cpp, we could delay the localization but this just feels easier and doesn't seem to break things.





graphics_threaded.cpp that is using double quotes.
test cases:
https://regex101.com/r/c3IWM0/1





















CGraphics_Threaded::LoadPng produces a lot of errors, the game randomly crashes. Probably because m_vWarnings was accessed in both the main thread on init and some jobs in the browser.
I found this by commenting out the condition guarding m_vWarnings.emplace_back(FormatPngliteIncompatibilityWarning(PngliteIncompatible, pFilename));
and
m_vWarnings.emplace_back(FormatPngliteIncompatibilityWarning(PngliteIncompatible, pContextName));
However, if local assets & community icons...








#!/bin/env python3
from random import random
from time import sleep
MSGCOUNTDOWN = "%ss untill randomize"
MSGRANDOMIZE = "tunes randomized"
DELTA = 5 # seconds between each random
FIFOPATH = "./fifo.fifo"
TUNES = {
("ground_control_speed", 4.00, 14.00), # Maximum running speed on the ground. (Higher values make the character move faster).
("ground_control_accel", 0.50, 4.00), # Acceleration on the ground. (Higher values make the character speed up faster).
("ground_friction", 0.30, 1.00), # Ground friction. (Higher values make the character stop faster).
("ground_jump_impulse", 8.00, 18.00), # Jump force from the ground. (Higher values make the character jump higher).
("air_jump_impulse", 6.00, 16.00), # Jump force in the air. (Applies to double jumps; higher values allow higher jumps).
("air_control_speed", 2.00, 9.00), # Maximum speed when moving in the air. (Higher values allow faster air movement).
("air_control_accel", 0.50, 3.00), # Acceleration in the air. (Higher values allow quicker changes in air movement).
("air_friction", 0.70, 1.10), # Air friction. (Higher values reduce the character's air speed more quickly).
("gravity", 0.30, 0.80), # Gravity strength. (Lower values make the character float longer; higher values make them fall faster).
}
def write(s):
with open(FIFOPATH, "w") as fifo:
fifo.write(s)
print(s)
sleep(1)
while True:
out = "broadcast %s\n" % MSGRANDOMIZE
for name, min, max in TUNES:
value = min + random() * (max - min)
value = round(value, 2)
out += "tune %s %s\n" % (name, value)
write(out)
if DELTA > 3:
sleep(DELTA - 3)
for i in range(3):
write("broadcast " + MSGCOUNTDOWN % (3 - i))
sleep(1)
else:
sleep(DELTA)
@Evelyn 




#!/bin/env python3
from time import sleep
MSGRANDOMIZE = "Подпишись на наш Telegram @serv! На 500 подписчиков будет крупный розыгрыш на слоунет. Также у нас дешевыйслоунет и слоунет!"
DELTA = 3600 # интервал между сообщениями в секундах
FIFOPATH = "./fifo.fifo"
def write(s):
with open(FIFOPATH, "w") as fifo:
fifo.write(s)
print(s)
sleep(1)
while True:
write(f"broadcast {MSGRANDOMIZE}")
sleep(DELTA) (edited)









































































































([String], ((Int, Int), (Int, Int))) because I'm not allowed to have proper state





([String], ((Int, Int), (Int, Int))) because I'm not allowed to have proper state 































(edited)
























skip_vertex_transform



skip_vertex_transform 














datasrc/network.py:L7 PlayerFlags = ["PLAYING", "IN_MENU", "CHATTING", "SCOREBOARD", "AIM"]



- dont want to hate on your work but playerflags are so damn precious





datasrc/network.py:L7 PlayerFlags = ["PLAYING", "IN_MENU", "CHATTING", "SCOREBOARD", "AIM"] 



- dont want to hate on your work but playerflags are so damn precious 















































then ye, that's about what we've discussed














foldr such that it terminates given an infinite list...




































ecs can be hella fast tho





unity ecs and some lua based framework does do call chains to setup the world. (edited)



also as i said before, game devs are kinda dumb














i mean unity ecs have demos comparing the two systems single-threaded

i mean unity ecs have demos comparing the two systems single-threaded 




























































































































stepForwards above, the liftM2 (,) at the start of it coerces to the type (([String], ((Int, Int), (Int, Int))) -> [String]) -> (([String], ((Int, Int), (Int, Int))) -> ((Int, Int), (Int, Int))) -> (([String], ((Int, Int), (Int, Int))) -> ([String], ((Int, Int), (Int, Int))))liftM2 (,) is at least cabable of coercing to that monster of a type(State -> [String]) -> (State -> ((Int, Int), (Int, Int))) -> (State -> State), but the internal structure of State is still there for me to keep in mind

compose2 = (.) . (.)
1



































































I agree, dangerous commands should be registered with a new CFGFLAG_DANGEROUS.
what about cmdflag_dangerous?CMDFLAG_PRACTICE and CMDFLAG_TEST exist
CFGFLAG_SERVER is also used for commands. And config variables are considered commands internally. (edited)

CMDFLAG_ prefix, otherwise I would prefer the simplicity of having only one prefix CFGFLAG_.

CFGFLAG. I guess it would be cleaner to separate the command and config flags but then you'd have to avoid using the same bits in the flags, but that probably requires a discussion first

CGameConsole::CInstance::ExecuteLine is brittle though. For example doesn't check for ; quit
m_pGameConsole->m_pConsole->ExecuteLine(pLine);
which says if dangerous commands are enabled/disabled
console_allow_dangerous command in src/engine/shared/console.cpp instead




CGameConsole::CInstance::ExecuteLine doesn't parse commands yet, you can separate multiple commands with semicolon. echo;quit quits the client without confirmation (with your PR) (edited)
Print(OUTPUT_LEVEL_STANDARD, "console", "Test commands aren't allowed, enable them with 'sv_test_cmds 1' in your initial config.");

void cxxbridge1$IConsole$ExecuteLine(::IConsole &self, ::StrRef *pStr, ::std::int32_t ClientId, bool InterpretSemicolons, bool AllowDangerous) noexcept {
void (::IConsole::*ExecuteLine$)(::StrRef, ::std::int32_t, bool, bool) = &::IConsole::ExecuteLine;
(self.*ExecuteLine$)(::std::move(*pStr), ClientId, InterpretSemicolons, AllowDangerous);
}
console.rs











unbindall though. Alternatives that would make it less dangerous would already be enough, including removing it and changing how default binds work. Not really an easily solvable issue. The other dangerous commands aren't really problematic, they make you lose a run and then you know not to trust that person again. unbindall;quit immediately deletes all binds.


unbindall though. Alternatives that would make it less dangerous would already be enough, including removing it and changing how default binds work. Not really an easily solvable issue. The other dangerous commands aren't really problematic, they make you lose a run and then you know not to trust that person again. unbindall;quit immediately deletes all binds. 

unbindall though. Alternatives that would make it less dangerous would already be enough, including removing it and changing how default binds work. Not really an easily solvable issue. The other dangerous commands aren't really problematic, they make you lose a run and then you know not to trust that person again. unbindall;quit immediately deletes all binds. 



















(Int, Int, Direction), where Direction is an enum of four possible values((Int, Int), Direction) because 


