00:00:16 -!- littlebobeep has quit (Ping timeout: 240 seconds).
00:03:46 <esolangs> [[Mindcrush]] M https://esolangs.org/w/index.php?diff=94948&oldid=66255 * PythonshellDebugwindow * (+67) Add categories, use HTTPS
00:24:06 <zzo38> I have sometimes used typeof. It is sometimes useful in macros
00:26:30 <zzo38> Is there a list of all proposals?
00:31:09 <esolangs> [[X(?)]] N https://esolangs.org/w/index.php?oldid=94949 * Lemonz * (+3621) Created page with "'''X(?)''' is an entirely probabilistic Esolang while one command is present: X(?), this command does a random thing from a list of commands and feeds in random parameters, li..."
00:31:22 <esolangs> [[User:Lemonz]] https://esolangs.org/w/index.php?diff=94950&oldid=94944 * Lemonz * (+12) /* Actually a thing language */
00:45:36 <b_jonas> zzo38: http://www.open-std.org/JTC1/SC22/WG14/www/wg14_document_log.htm probably
00:45:49 <b_jonas> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/ for C++
01:01:23 <zzo38> I like the #embed idea (I had seen before). Some of my ideas for improvement of C is scoped macros (which work during the main part of the compiler instead of the preprocessor, and are treated like identifiers whose type is a macro), extended macros (which can themself define new macros, etc), and a few others
01:02:09 <zzo38> Also, fopencookie is another one
01:04:20 <esolangs> [[FOSCode]] M https://esolangs.org/w/index.php?diff=94951&oldid=49001 * PythonshellDebugwindow * (+82) Categories
01:05:09 <b_jonas> I still don't much care what gets into C/zig and just use C++/rust for everything
01:05:21 <b_jonas> C has to stay around so we can compile existing programs of course
01:06:15 <esolangs> [[FOS-X]] M https://esolangs.org/w/index.php?diff=94952&oldid=49056 * PythonshellDebugwindow * (+32) WIP, category
01:10:41 <b_jonas> I like don't get the point of language that is founded on "let's follow everything that C++/Rust does, copy all its modern features, except we don't have objects with nontrivial destructors to distinguish C++/Rust from C/zig." why? how is that a useful paradigm?
01:15:51 <oren> I'm pretty sure there are a lot more differences between C and C++ than that
01:16:09 <oren> Even in the most modern versions
01:16:33 <b_jonas> yes, but that's the point, why do we need all those differences so you have to learn them instead of only using C++ for new code?
01:16:47 <oren> That said, I do not see the point of Zig if Zig does not eliminate entirely the concept of undefined behaviour
01:17:26 <oren> because C++ has a more inconsistent ABI
01:18:01 <oren> and Rust doesn't even have an ABI at all
01:19:22 <b_jonas> yes. how it works is basically that there's a common lowest denominator ABI, historically defined by C, and now all these languages (C++, rust etc) let you call functions of that ABI and write functions exported with that ABI, and then you can call from one language to the other
01:21:30 <b_jonas> but you can have stuff with an inconsistent ABI in C too, if you try to use certain library features whose ABI depend on what defines you set or what compile options you use like whether you enable threading or 32-bit largefiles or just try to refer to libc types like FILE in windows or, heaven forbid, refer to the type long between windows gcc and windows msvc
01:22:57 <b_jonas> why doesn't windows gcc just support an msvc-like target where long is 32 bits long instead of 64 I don't really get. I understand why it can't imitate all of the libc abis in various msvc versions, but what's up with long?
01:23:45 <b_jonas> gcc has like hundreds of weird options for C that let it become seriously ABI-incompatible with itself even on linux, why not support 32-bit longs too?
01:25:41 <oren> Zig is currently the best contender for replacing C, but it probably can't because it doesn't solve any of the problems with C
01:29:31 <oren> An ideal contender would have an actual spec, no undefined behaviour in that spec, and a fully-defined ABI on all major hardware platforms
01:31:45 <oren> Then languages could be configured to use *that* ABI instead of the fuzzy C one
01:33:53 <oren> And writers of super low level code could quit worrying about the next LLVM release remisinterpreting their code in a new creative way
01:34:23 <zzo38> I think some kinds of undefined behaviour are acceptable, if they partially define what kinds of things might happen, but C has too much. Also, the good features of C will have to be kept, and many ones trying to replace C don't do so. Furthermore, many new designs are using Unicode, and I think that is a bad idea; a replacment for C must not use Unicode.
01:36:24 <b_jonas> oren: I disagree. you can't have the full power of no memory safety and still have a memory-safe (required for no undefined behavior) language. and we do have the core C ABIs defined well enough in papers, that's why all the languages can implement it, while they can do experiments with a changing API for when you don't need to have a function in that ABI
01:37:09 <b_jonas> nor can you just replace the C ABI with something different, we have lots of existing libraries compiled to it that we have to be able to call
01:37:50 <b_jonas> you can add stuff to it, slowly, like how a bool type is now part of it effectively because all of C99, C++, rust etc support that type
01:38:36 <b_jonas> so is a 64-bit integer type on 32-bit systems
01:41:49 <b_jonas> and you can't have an ABI where you can call non-memory-safe functions from a memory-safe language
01:42:16 <b_jonas> you can have a large part of your program memory-safe, which you can already do if you use the right subsets of C++ or rust
01:43:22 -!- littlebobeep has joined.
01:44:41 <oren> "no undefined behaviour" doesn't mean "memory safe"
01:44:52 <b_jonas> memory safe is a requirement for it
01:44:58 <b_jonas> it's just one of the harder parts
01:45:22 <oren> No, it means the language definition does not contain a clause stating that "anything can happen if X is true"
01:45:41 <int-e> anything can happen if you change the bits representing a pointer
01:46:17 <int-e> you can't really expect to do better than that and still have a high level language (that takes care of memory representation of objects and their location)
01:46:50 <int-e> if you can't do that to a pointer, you have a memory-safe language
01:47:09 <int-e> so yeah, I'm agreeing with b_jonas here.
01:48:27 <oren> The clause should instead state that, for instance "the machine code accessing a pointer shall be emitted in all cases as if the address was valid for an object of the pointer's referent type"
01:49:06 <oren> Rather than being allowed to do anything it wants in the case where the compiler doesn't think the pointer is valid
01:50:09 <b_jonas> and further, nontrivial destructors (which C++/Rust have and C/zig specifically exclude) are a very useful tool to have a memory-safe subset. it lets you avoid use after free. you deallocate something when your smart pointer variable goes out of scope then you won't accidentally dereference it after having freed it. if you have no custom destructors then you have to call the deallocation function
01:50:15 <b_jonas> yourself, and the language won't notice that you call the deallocation first and then dereference, because the deallocation function is not special, it's just an ordinary function.
01:50:33 <b_jonas> I'm still allowed to cheat that with the non-memory-safe subset of C++/rust.
01:51:11 <b_jonas> and yes, destructors aren't the only part, you can for example index past an array in C++ or rust if you call the functions that don't check array bounds, or do undefined behavior in other ways.
01:53:46 <oren> But indexing past an array end does not have to be udefined behaviour in the C sense- instead the compiler could be required to emit the indexing logic normally regardless of whether the index is valid.
01:54:05 <b_jonas> they're not the only tool, types themselves are a useful tool as opposed to old untyped languages, but these modern languages already all have types
01:55:56 <oren> C doesn't really have types... it has implementor-defined types
01:56:39 <b_jonas> C has user-defined types. I can define two custom types and then I can't accidentally pass the wrong type of value to my function because the function prototype tells which type it accepts.
01:56:55 <b_jonas> the compiler will complain if I try to pass the wrong one
01:56:59 <b_jonas> this is what I mean by the type system
01:57:26 <b_jonas> C++, zig, rust also all allow this
01:57:42 <oren> iirc the compiler doesn't complain if you pass an int to a function taking a unsigned
01:58:37 <b_jonas> yes, there are cases when it just converts the type automatically, but that's irrelevant
01:59:11 <oren> well Zig actually fixes this problem
01:59:36 <oren> Zig requires explicit type conversions in a lot of places where C doesn't
01:59:52 <oren> So I guess that's one thing with C that Zig fixes
02:02:14 <b_jonas> sure, there's a degree of difference in how much the builtin and library types are discriminated. but since you can define user-defined types, if you don't want to mix signed and unsigned numbers then you can wrap them in your custom types and use them that way, similarly if you don't want to mix ordinary arrays vs sorted arrays vs binary heaps like the old C++ standard library expects then you can
02:02:20 <b_jonas> define a new flat_map type that represents a sorted array and a new type that represents a binary heap
02:02:27 <oren> Too bad Zig doesn't fix the number one problem people have with C/C++, the UB. Probably because someone told them they couldn't have fast code generated without UB and they believed it.
02:03:05 <b_jonas> boost defines the flat_map, recent versions of the C++ standard define the heap (called std::priority_queue)
02:04:21 <esolangs> [[X(?)]] https://esolangs.org/w/index.php?diff=94953&oldid=94949 * Lemonz * (+5)
02:04:21 <b_jonas> oren: no, it's because we don't want to discard all our existing libraries, and you can only call them from your language if your language allows undefined behavior in most of the ways that those libraries allow
02:04:28 <b_jonas> the ABIs of those libraries
02:04:45 <esolangs> [[X(?)]] https://esolangs.org/w/index.php?diff=94954&oldid=94953 * Lemonz * (+5) /* Q(?) */
02:05:06 <oren> Again, I mean by this C-style UB, i.e. cases in whihc the language compiler is allowed to emit any machine code that it wants
02:05:23 <b_jonas> you can define safe wrappers around them, like there are thin C++ or rust wrappers around lots of C libraries that wrap them in abstractions like calling the deallocating C function from a real destructor
02:06:07 <b_jonas> you can have a compiler or language that doesn't allow you to call the existing libraries, but it's not very useful
02:07:51 <b_jonas> so either the language doesn't get much use as a general purpose language.
02:08:00 <oren> I don't see why being able to call functions written in other languages requires *this* language to have constructs with UB
02:08:29 <oren> Sure the behaviour of functions written in other languages is defined by those languages
02:09:06 <oren> But the machine code emitted by the Zig compiler could be fully specified by the Zig language spec
02:09:47 <b_jonas> you can have sandboxed execution, like how the (java, javascript, flash, webasm) code in my browser isn't supposed to be able to access things outside the browser sandbox even when it trashes its own memory; or how my user programs ran on linux aren't supposed to get root access even when they trash their own memory; or in CPUs where even to the extent of little undefined behavior in how the CPU can
02:09:54 <b_jonas> behave how it wants isn't supposed to allowed to allow breaking out of the sandbox so the user-space program gets operating system access
02:09:59 <b_jonas> the sandboxes have bugs but the intention is that you can't break out of them
02:10:43 <b_jonas> but with all of these, the programs can still be unsafe if they want within their sandbox, completely break their own environment
02:10:57 <oren> why are you conflating safety with specifiedness
02:12:39 <oren> Like, I think that the C spec should say that the behaviour of say, int32_t*x = 0; *x = 1; should be to access the address 0 and write the 32-bit number 0x00000001 to it.
02:13:50 <oren> that may result in turn in various other things happening, of course, but the C spec doesn't need to say that anywhere. The C spec should simply specify what kind of machine code should be emitted by given C code
02:16:57 <oren> Unfortunately, that's not how C is specified, and that's the root of the problem
02:30:50 <oren> Another example: they did not need to specify that signed integer overflow is UB-- instead they should have specified that adding two signed integers with the + operator shall emit machine code that adds them together in the normal way for the platform; any unexpected result of that, does not need to be given any mention in the language spec
02:35:56 -!- Sgeo_ has joined.
02:39:00 -!- Sgeo has quit (Ping timeout: 276 seconds).
04:04:21 <zzo38> Yes, that would help, although GCC has -fwrapv and -ftrapv flags, but just emitting a add instruction would do if you do not use these flags. (On MMIX, there is a separate signed and unsigned addition instructions; the signed one can be an error but unsigned one is never an error)
05:16:12 <b_jonas> zzo38: x86 used to have an instruction specifically for this too, but it was rarely used and taking up precious one-byte instruction space so they eliminated it for x86_64
05:32:15 -!- fowl6 has joined.
05:33:55 -!- fowl has quit (Ping timeout: 256 seconds).
05:33:55 -!- fowl6 has changed nick to fowl.
06:28:47 -!- dyeplexer has joined.
07:10:15 -!- tromp has joined.
07:51:01 -!- Sgeo_ has quit (Read error: Connection reset by peer).
08:02:58 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
08:04:16 -!- littlebobeep has quit (Ping timeout: 240 seconds).
08:06:49 -!- littlebobeep has joined.
08:32:04 <fizzie> Re the wiki migration, it's nominally scheduled at 1pm BST, so I think I'll go read-only at around 11am. Looks like there's not much wiki activity going on anyway (maybe the announcement scared people off).
09:12:40 -!- tromp has joined.
09:27:19 -!- __monty__ has joined.
10:37:01 -!- Lord_of_Life_ has joined.
10:38:42 -!- Lord_of_Life has quit (Ping timeout: 276 seconds).
10:39:45 -!- Lord_of_Life_ has changed nick to Lord_of_Life.
11:19:58 -!- kee has joined.
11:21:27 -!- definitelya has joined.
11:28:37 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
11:50:54 -!- tromp has joined.
11:58:57 -!- tech_exorcist has joined.
12:17:23 -!- esolangs has joined.
12:17:23 -!- ChanServ has set channel mode: +v esolangs.
12:58:52 -!- esolangs has joined.
12:58:52 -!- ChanServ has set channel mode: +v esolangs.
13:00:53 -!- esolangs has joined.
13:00:53 -!- ChanServ has set channel mode: +v esolangs.
13:12:01 -!- esolangs has joined.
13:12:01 -!- ChanServ has set channel mode: +v esolangs.
13:29:48 -!- perlbot has quit (Ping timeout: 240 seconds).
13:30:32 -!- simcop2387 has quit (Ping timeout: 248 seconds).
13:36:23 <b_jonas> so did the migration happen?
13:36:30 <b_jonas> is this the new server already?
13:36:40 <b_jonas> fungot, where do I find the Holy Grail?
13:37:25 -!- simcop2387 has joined.
13:38:56 -!- perlbot has joined.
13:41:28 -!- littlebobeep has quit (*.net *.split).
13:41:28 -!- chiselfuse has quit (*.net *.split).
13:43:10 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
13:49:21 <fizzie> It could be. It's hard to say since it's supposed to remain a KVM thing, and keep the existing IP address and things.
13:50:52 <fizzie> They sent an email at 1pm that it's going to start, and haven't sent another one since then, so I guess I'll just wait.
13:51:10 <fizzie> The absence of fungot is probably unrelated.
13:51:38 <b_jonas> did they say an order of magnitude for how long the migration is expected to take? an hour, a day, a week?
13:56:17 <fizzie> I think they said 1-2 hours, which would be about now.
13:57:23 -!- fungot has joined.
13:57:32 <fizzie> fungot: And how are you feeling?
13:57:32 <fungot> fizzie: are you sure the first runs didn't move the file into ( scheme-report-environment 5)
14:01:32 -!- chiselfuse has joined.
14:02:20 -!- littlebobeep has joined.
14:09:50 -!- tromp has joined.
14:12:41 <b_jonas> ok, then I'll wait a few more hours and then if the wiki works I'll assume it's the new one
14:15:34 -!- littlebobeep has quit (Ping timeout: 240 seconds).
14:23:25 -!- littlebobeep has joined.
14:36:41 -!- tech_exorcist has quit (Quit: Disconnecting).
14:54:46 -!- Sgeo has joined.
15:41:13 -!- tech_exorcist has joined.
16:16:03 -!- immibis has quit (Ping timeout: 276 seconds).
16:45:40 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
17:42:06 -!- tromp has joined.
17:44:49 -!- p_____ has joined.
17:44:58 -!- p_____ has quit (Remote host closed the connection).
17:47:04 -!- zzo38 has quit (Ping timeout: 248 seconds).
18:04:00 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
18:04:42 -!- tromp has joined.
18:05:52 -!- tromp has quit (Client Quit).
18:06:36 <esolangs> [[Special:Log/newusers]] create * Xanadryden * New user account
18:08:05 -!- tromp has joined.
18:09:50 <esolangs> [[Literally every golflang ever]] N https://esolangs.org/w/index.php?oldid=94955 * Otesunki * (+2842) initial commit
18:11:37 <esolangs> [[Literally every golflang ever]] https://esolangs.org/w/index.php?diff=94956&oldid=94955 * Otesunki * (-3) correcting several spelling errors + reordering
18:13:47 <esolangs> [[Esolang:Introduce yourself]] https://esolangs.org/w/index.php?diff=94957&oldid=94933 * Xanadryden * (+310)
18:15:50 <esolangs> [[Joke language list]] https://esolangs.org/w/index.php?diff=94958&oldid=94851 * Otesunki * (+72)
18:17:04 -!- littlebobeep has quit (Ping timeout: 240 seconds).
18:19:40 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
18:20:21 <esolangs> [[Literally every golflang ever]] https://esolangs.org/w/index.php?diff=94959&oldid=94956 * Otesunki * (+166) categorization
18:23:19 -!- tromp has joined.
18:23:33 <esolangs> [[Literally every golflang ever]] https://esolangs.org/w/index.php?diff=94960&oldid=94959 * Otesunki * (+111) elaborate on errors
18:25:58 -!- dyeplexer has quit (Remote host closed the connection).
18:29:44 <fizzie> They say it's migrated now.
18:29:57 <fizzie> Should take out that message then, I guess.
18:35:41 <esolangs> [[FP trivia]] https://esolangs.org/w/index.php?diff=94961&oldid=89229 * Fpstefan * (+12) /* External links */
18:38:58 <esolangs> [[Vurl]] https://esolangs.org/w/index.php?diff=94962&oldid=94639 * Viba * (+118) add link to vurlrs
18:40:19 <esolangs> [[Shakespeare]] https://esolangs.org/w/index.php?diff=94963&oldid=91540 * Xanadryden * (+1538) Fix stub.
19:11:20 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94964&oldid=94910 * SirBrahms * (+2996) Add small documentation and Examples
19:12:40 -!- zzo38 has joined.
19:12:52 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94965&oldid=94964 * SirBrahms * (+0) /* Value formating */
19:16:32 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94966&oldid=94965 * SirBrahms * (+121) /* Value formating */
19:17:50 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94967&oldid=94966 * SirBrahms * (+1) /* Value formating */
19:34:21 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
19:34:51 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94968&oldid=94967 * SirBrahms * (+1234) Add conditional documentation
19:35:23 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94969&oldid=94968 * SirBrahms * (+1) /* Examples of conditionals */
19:35:49 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94970&oldid=94969 * SirBrahms * (+9) /* Examples of conditionals */
19:41:29 <esolangs> [[Uzumaki]] https://esolangs.org/w/index.php?diff=94971&oldid=94942 * Zero player rodent * (+45)
19:44:28 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94972&oldid=94970 * SirBrahms * (+729) Add loop-documentation
19:45:31 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94973&oldid=94972 * SirBrahms * (+174) /* Instructions */
19:47:17 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94974&oldid=94973 * SirBrahms * (+87) /* Comparisons */
19:48:31 -!- tromp has joined.
19:54:05 <esolangs> [[Shakespeare]] https://esolangs.org/w/index.php?diff=94975&oldid=94963 * Xanadryden * (+2097) Fix stub more.
19:58:15 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94976&oldid=94974 * SirBrahms * (+1276) Add label documentation
20:00:38 <esolangs> [[Shakespeare]] https://esolangs.org/w/index.php?diff=94977&oldid=94975 * Xanadryden * (+2782) /* Examples */ Added Hello World!
20:04:17 <esolangs> [[Shakespeare]] https://esolangs.org/w/index.php?diff=94978&oldid=94977 * Xanadryden * (+40) /* Scenes */
20:05:41 <esolangs> [[Shakespeare]] M https://esolangs.org/w/index.php?diff=94979&oldid=94978 * Xanadryden * (+17) /* Hello World! */
20:11:37 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94980&oldid=94976 * SirBrahms * (+480)
20:11:53 -!- immibis has joined.
20:17:07 <esolangs> [[User:Xanadryden]] N https://esolangs.org/w/index.php?oldid=94981 * Xanadryden * (+579) Created page with "I love the ideas of making and using a programming language intentionally difficult or tedious to use, and hiding programs in seemingly inconspicuous text. I am planning a..."
20:20:50 <esolangs> [[COSOL]] https://esolangs.org/w/index.php?diff=94982&oldid=94980 * SirBrahms * (+71) /* Examples */
20:27:38 -!- definitelya has quit (Quit: h).
20:36:07 <zzo38> I dreamt that my character (Ziveruskex) from the GURPS game is in the hotel with us. Once we were at the entrance, where there are the telephones, to leave, Ziveruskex then decided not to come.
20:44:25 <esolangs> [[Fragile]] M https://esolangs.org/w/index.php?diff=94983&oldid=93917 * PythonshellDebugwindow * (+53) Add categories
20:46:06 <esolangs> [[Language list]] M https://esolangs.org/w/index.php?diff=94984&oldid=94946 * PythonshellDebugwindow * (+14) /* F */ add
20:47:35 <esolangs> [[COSOL]] M https://esolangs.org/w/index.php?diff=94985&oldid=94982 * PythonshellDebugwindow * (-2) Stub -> WIP
20:48:54 -!- littlebobeep has joined.
21:05:56 -!- tech_exorcist has quit (Quit: Disconnecting).
21:12:23 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
21:26:55 -!- kee has quit (Quit: ⭘).
21:49:48 -!- chibi has joined.
21:55:03 <esolangs> [[Sitelen ilo]] M https://esolangs.org/w/index.php?diff=94986&oldid=94923 * Jan Gamecuber * (+13)
22:12:43 -!- __monty__ has quit (Quit: leaving).
22:15:59 <esolangs> [[Talk:Sitelen ilo]] https://esolangs.org/w/index.php?diff=94987&oldid=94917 * Jan Gamecuber * (+1641) /* Turing Completeness */ new section
22:18:01 <esolangs> [[Sitelen ilo]] https://esolangs.org/w/index.php?diff=94988&oldid=94986 * Jan Gamecuber * (-12) Turing Completeness being added to categories.
22:18:41 <esolangs> [[Talk:Sitelen ilo]] https://esolangs.org/w/index.php?diff=94989&oldid=94987 * Jan Gamecuber * (+7)
22:31:06 -!- esolangs has quit (Ping timeout: 276 seconds).
22:31:43 -!- esolangs has joined.
22:31:44 -!- ChanServ has set channel mode: +v esolangs.
22:38:54 -!- chibi has quit (Ping timeout: 276 seconds).
22:48:26 <esolangs> [[Uzumaki]] https://esolangs.org/w/index.php?diff=94990&oldid=94971 * Zero player rodent * (+45)
22:55:05 <esolangs> [[Uzumaki]] https://esolangs.org/w/index.php?diff=94991&oldid=94990 * Zero player rodent * (+144)
23:01:43 <esolangs> [[Sitelen ilo]] M https://esolangs.org/w/index.php?diff=94992&oldid=94988 * Indigo * (+53)
23:02:28 <esolangs> [[Uzumaki]] https://esolangs.org/w/index.php?diff=94993&oldid=94991 * Zero player rodent * (+28)