Compare commits

...

590 Commits

Author SHA1 Message Date
Playtester
d6d850ba6e
Third Job Stats Level 61-70 (#8669)
- Combined trans and non-trans 3rd jobs in job_stats.yml as they have the exact same values
- Added job bonus stats for level 61-70 for 3rd jobs
- Added job bonus stats for level 51-70 for various extended classes
2024-09-22 10:05:14 +02:00
Playtester
63baa62f70
Finger Offensive Renewal Damage (#8668)
- Fixed damage of Finger Offensive being 5 times too high
- Added job stat bonus for Sura job level 61
- Fixes #8667
2024-09-21 18:15:38 +02:00
AoShinHo
8bd89b7fc0
Added Footprint related items (#8660)
* Added Footprint Enchants
* Summer_Select_Box4 package
2024-09-21 14:49:32 +02:00
Daegaladh
8c9e447fd5
Fixed Castling not getting the correct target (#8657)
Follow-up to ffead570b20060da5885f6babd28d5cc5b14eef0
2024-09-20 10:23:53 +02:00
AoShinHo
fa145ac838
New NPC, Hateffects & Skill Constants (#8656) 2024-09-18 17:28:21 +02:00
Lemongrass3110
7880596b03 Fixed clif_guild_positioninfolist
Fixes #8648

Thanks to @thanna, @laziem, @skstrife and @AoShinRO
2024-09-17 17:10:27 +02:00
Jittapan Pluemsumran
f3f8e63448
Don't allow setting "first pincode" if pincode is already set (#8654) 2024-09-17 16:29:36 +02:00
Kanin Temsrisuk
29671fa5cd
Fixed Realgar_Shooter_EXE location (#8647) 2024-09-15 09:41:05 +02:00
AoShinHo
077f714e05
Converted ZC_SKILLINFO_DELETE to struct (#8595)
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 02:49:31 +02:00
AoShinHo
61b3f4a34d
Converted ZC_USE_SKILL to struct (#8599)
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 01:42:12 +02:00
AoShinHo
d382b3f55a
Converted ZC_DESTROY_ROOM to struct (#8591)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 01:17:17 +02:00
AoShinHo
82a0c503ce
Converted ZC_ACK_GUILD_MENUINTERFACE to struct (#8627)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 00:29:05 +02:00
AoShinHo
f3d1541e44
Converted ZC_MYGUILD_BASIC_INFO to struct (#8628)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 23:57:41 +02:00
AoShinHo
c92a7e529b
Converted ZC_POSITION_INFO to struct (#8629)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 23:06:38 +02:00
AoShinHo
ca86ac12c8
Implemented ZC_BAN_LIST3 packet (#8632)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 22:41:36 +02:00
AoShinHo
fca803220b
Implemented ZC_WARPLIST packet (#8600)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 20:06:41 +02:00
AoShinHo
70e8518a32
Implemented /resetcooltime (#8613)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 19:26:49 +02:00
Jannik
6c41f9bb3f
Fix typos in quest_db parser (#8642) 2024-09-14 18:56:01 +02:00
AoShinHo
5c7c874f72
Converted ZC_GUILD_CHAT to struct (#8634)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 18:25:04 +02:00
AoShinHo
9761fdf4da
Converted ZC_DELETE_RELATED_GUILD to struct (#8638)
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 17:44:30 +02:00
AoShinHo
1425705a2a
Converted ZC_ACK_REQ_ALLY_GUILD to struct (#8637)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 12:47:52 +02:00
AoShinHo
d2809156bc
Converted ZC_ACK_REQ_HOSTILE_GUILD to struct (#8639)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-13 17:57:26 +02:00
AoShinHo
06e2fc95a1
Converted ZC_REQ_ALLY_GUILD to struct (#8636) 2024-09-13 10:53:23 +02:00
AoShinHo
c4b77f1942
Converted ZC_CHANGE_CHATROOM to struct (#8589)
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-09-12 14:51:13 -04:00
AoShinHo
ae0bb4929c
Converted ZC_REQ_EXCHANGE_ITEM&ZC_ACK_EXCHANGE_ITEM to struct (#8581)
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-09-12 14:17:54 -04:00
AoShinHo
00c88167ce
Converted ZC_REQ_TAKEOFF_EQUIP_ACK to struct (#8580)
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2024-09-12 10:47:16 -04:00
Haydrich
1f25ebc90a
Corrected Spore Explosion and Earth Shaker skills effect (#8611) 2024-09-11 15:25:35 +02:00
Atemo
5bc79f9d0a
Fixed UNT_JACK_FROST_NOVA and UNT_GROUND_GRAVITATION (#8619)
* Added missing UNT_JACK_FROST_NOVA and UNT_GROUND_GRAVITATION in skill_unit_onplace_timer
(damage over time were missing)
2024-09-11 14:27:40 +02:00
Atemo
d815fabc28
Corrected jobs of items 400488 and 400489 (#8624)
Fixes #8616

Thanks to @kaninhot004
2024-09-11 01:52:33 +02:00
Lemongrass3110
88223c56b8
Fixed subtype of 28140 (#8622)
Fixes #8601

Thanks to @gmragnarok
2024-09-11 00:32:02 +02:00
Atemo
5fcbcda76f
Corrected "Venomous Chimera" re-spawn timer (#8621) 2024-09-11 00:00:34 +02:00
Atemo
c7d9c2cedd
Corrected enchant grade chances from refined level 16+ (#8620)
Updated according to https://probability.gnjoy.com/RO/GRADEBUILD/GRADEBUILD/0001
2024-09-10 23:31:57 +02:00
Singe Horizontal
5452ae4038
Enable Log reloading (#8612) 2024-09-10 22:19:47 +02:00
Lemongrass3110
baf7ec23d8
Removed commented packetdb entries (#8617) 2024-09-10 07:55:21 +02:00
Jittapan Pluemsumran
a687ddeb85
Eternal Chaos now reduces both hard DEF and soft DEF (#8609) 2024-09-05 23:46:02 +07:00
Jittapan Pluemsumran
540a9a0f30
Fixed wrong null pointer check in guild_reply_reqalliance. (#8610) 2024-09-05 19:01:20 +07:00
AoShinHo
d6f2f49b6d
Converted ZC_ENTER_ROOM to struct (#8590)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-03 18:16:18 +02:00
Playtester
247483c538
Super Novice Soul Link Equip Checks (#8605)
- Fixed base level requirements for SN soul link to take effect (91->90, 97->96)
- Fixed SN soul link not ignoring the item's base level restrictions
- SN soul link now allows you to equip items even if a status change would usually prevent you from doing so
- SN soul link now allows you to equip broken helmets and broken level 4 weapons
- Fixes #8604
2024-09-03 18:06:05 +02:00
Daegaladh
418873f25e
Assassin quest fixes and cleanup (#8498)
-Fixes killmonsterall killing monsters from other part of the quest
-Follow-up to 979e13dd66103e3b6387e9acfa48642a57b66a26 preventing players with level under 49 to get the reward
-New header style
-Cleaned up set commands
2024-09-02 20:29:46 +02:00
alexxus
d8dc0e6f41
Fixed static cast (#8603)
Fixes #8602
2024-09-02 17:57:21 +02:00
AoShinHo
37bc0f4c10
PACKET_ZC_HIGHJUMP (#8588) 2024-08-29 07:50:39 +02:00
Daegaladh
ffead570b2
Fixed Homunculus Amistr skills (#8556) 2024-08-27 20:32:15 +02:00
AoShinHo
5138ae74fc
Converted ZC_CHANGE_DIRECTION to struct (#8584)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 19:04:38 +02:00
AoShinHo
e0d1250645
Converted ZC_USER_COUNT to struct (#8585)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 15:50:00 +02:00
AoShinHo
dc6aab3d92
Fixed guild name on alt+a (#8574)
Fixes #8522

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 13:05:03 +02:00
AoShinHo
d5267c63a9
Converted ZC_NOTIFY_ACT to struct (#8571)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 09:59:26 +02:00
Lemongrass3110
baded8330f
Fixed Candy Pouch Bag class requirements (#8577)
Fixes #8573

Thanks to @llchrisll
2024-08-26 14:27:47 +02:00
AoShinHo
f3c8c70c81
Improved status_isdead and status_get_status_data (#8570)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-22 22:36:29 +02:00
Atemo
295c5ba0f5
Corrections in episode 18 npcs (#8569)
* Corrected shop barter_ep18_1
* Corrected wolfvill enchant NPC

Fixed #8561
2024-08-21 13:43:29 +02:00
Aleos
dd1c12f624
Fix GD_CHARGESHOUT_BEATING check (#8564)
Add missing parentheses to ensure the player is in a guild and avoid a short circuit check.

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2024-08-19 09:07:39 +02:00
Atemo
1818600e50
Fixed episode 18, Mejai's daily quest (#8557)
Follow-up : 75c3fd1fc3

Thanks to @monbazko
2024-08-17 23:34:53 +02:00
Atemo
870227ff5e
Remove racial bonus of skill AG_ASTRAL_STRIKE_ATK (#8560)
Fixed #8559
2024-08-17 21:08:19 +02:00
Atemo
a9e51c09cc
Added some missing DisplayPc in status_db.yml (#8441)
* Added some missing DisplayPc in status_db.yml
  Some status should be displayed again to client around when the affected unit appears in the client's range

Status updated :
SC_SPELL_ENCHANTING from skill EM_SPELL_ENCHANTING
SC_MUSICAL_INTERLUDE from skill TR_MUSICAL_INTERLUDE
SC_JAWAII_SERENADE from skill TR_JAWAII_SERENADE
SC_PRON_MARCH from skill TR_PRON_MARCH
SC_POWERFUL_FAITH from skill IQ_POWERFUL_FAITH
2024-08-16 16:58:26 +02:00
Pokye
be3cc19fac
Updated Level 260/55 to 275/60 (#8546)
* Updated Level 260/55 to 275/60.
* Hp and Sp are unknown.
2024-08-16 16:18:20 +02:00
Atemo
37f402aca7
Updated EFST datas (#8553) 2024-08-16 15:44:27 +02:00
Haydrich
6f44b98fe9
Correct the element of Kunai of Shadow (#8554)
* Kunai of Shadow must be a Ghost element instead of Neutral.
2024-08-16 08:08:36 -04:00
Atemo
a5c939bec9
Updated addhomintimacy script command (#8551)
* The command now fails silently when no players are attached or if the player has no homunculus (like other homunculus script command)

Fixed #8534
2024-08-09 23:33:43 +02:00
Atemo
88ce3fe5d3
Adjusts the value of SC_HOLY_OIL debuff from IQ_OLEUM_SANCTUM skill (#8552)
* The debuff causing that the targets take more damage from long ranged physical damage for the skill duration is corrected from 50% to 3x(Skill Lv)%

Fixed #8520
2024-08-09 22:18:22 +02:00
Daegaladh
59c716ce23
Fixed Mars Armor-LT increasing nonexistent skill (#8549) 2024-08-08 11:48:54 +02:00
Atemo
5928ad75c6
Corrected TARGET of NPC_DAMAGE_HEAL in mob_skill_db.txt (#8540)
Fixed #8532
2024-08-06 22:33:58 +02:00
Haydrich
203b9d740d
Fixed an issue in rockridge quest (#8539)
* Corrected npcs Cactus Gunslinger hidden name
2024-08-06 14:13:10 +02:00
Atemo
75c3fd1fc3
Updated episode 18 dialogues (#8537)
Updated episode 18 dialogues using iRO text.
Renamed ep18_1_main variable by ep18_main (see sql update)
2024-08-04 15:47:47 +02:00
Atemo
e803ba5f8a
Updated renewal mob_db.yml (#8499)
* Updated map drops db
2024-08-03 21:17:22 +02:00
Playtester
c3ff38865e
Earth Spike and Heaven's Drive (#8536)
- Earth Spike now has the same cast time and aftercast delay as bolt spells (pre-re)
- Heaven's Drive now has an aftercast delay of 1000ms (pre-re)
- Fixes #8533
2024-08-03 18:55:19 +02:00
Aleos
94a731aad0
Correct Death Valley behavior (#8502)
* Follow up to 4b32621.
* The target player should be healed from the remaining SP before the SP reduction is applied.
* Update HP/SP without sending extra packets.
* Fix SP ratio.

---------

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-02 09:33:53 -04:00
Atemo
effd55d1ce
Updated "skilleffect" script command (#8505)
* Added an optional parameter to "skilleffect" script command to display the given skill effect on the specified ID (default : attached player).
2024-08-02 14:11:38 +02:00
Daegaladh
aacca52eec
Fixed Elemental SP recalc and packet conversion (#8531) 2024-08-02 13:58:24 +02:00
elanosilveira
4cab85cb19
Update hair_dyer.txt (#8519)
* Properly close the message box at the end of the dialogue instead of sending the player back to the main menu.

---------

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-08-01 09:50:30 -04:00
eppc0330
54dc915661
Add mapflag specialpopup (#8365)
* Add packet ZC_SPECIALPOPUP.
* Add mapflag and script command specialpopup.
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-08-01 09:05:54 -04:00
Singe Horizontal
612bf702ba
Restore a correct packet header (#8530)
Fixes #8529
2024-07-31 19:53:54 +02:00
Daegaladh
6f6c74b723
Fixed slow potion effect on pre-re (#8528) 2024-07-31 16:35:01 +02:00
Daegaladh
48b105405a
Fixed Homunculus Lif skills (#8513) 2024-07-28 18:56:47 +02:00
Daegaladh
3908b0e9ee
Fixed homunculus cooldown and aftercast delays (#8508)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-07-27 16:07:54 +02:00
Playtester
3cc32b6727
Removed Gunslinger Mine Damage Delay (#8517)
- Gunslinger Mine no longer has damage delay
- Freeze from Cryo Sphere / Ice Bullet will no longer be immediately broken by its own damage
- Fixes #8516
2024-07-26 20:43:46 +02:00
Atemo
e39fa4b66a
Corrected pet_db.yml script (#8509) 2024-07-21 14:12:23 +02:00
Atemo
c5eaa1544f
Updated Old Glast Heim instance (#8504)
Updated dialog and system of Old Glast Heim instance.
* Added missing checkweight
* Added missing dialogue and warp when a player did not receive the reward after killing the first mvp "Corrupted Soul"
* Corrected monster re-spawn on map 2 : previous monster spawn by the npc are now killed before new spawn
2024-07-16 22:33:34 +02:00
Daegaladh
1d9cfdb17d
Fixes custom warper var (#8503)
Follow-up to f8c9481673a8729fc99f5cbdf94e3ab8a188d91f
2024-07-14 23:09:50 +02:00
Aleos
4b32621c61
Resolve Death Valley HP/SP adjustment (#8501)
* Fixes #8428.
* The skill will now properly take the SP first before healing HP of the target player.
Thanks to @jamesandrewww!
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-07-13 09:47:55 -04:00
Vincent Stumpf
3b1c33c5d9
Fix stack overflow in npc_parse_shop (#8496) 2024-07-07 11:24:53 +02:00
Daegaladh
f8c9481673
Added optional Pre-Renewal Brasilis (#8480) 2024-07-06 23:24:48 +02:00
Playtester
78a2babe4d
Monster Losing Target Display (#8479)
- When a monster loses its target, it will now properly display movement to the next cell rather than snapping back to the previous cell
- Looters will no longer spam movement packets to the client when they go for loot
- Added some base implementation for sub-cell coordinates
- Fixes #8232

Co-authored-by: Lemongrass3110
2024-07-06 12:51:58 +02:00
Daegaladh
0a977c1fd7
Fixed vending_over_max behavior to match official (#8469)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-07-05 02:35:41 +02:00
Daegaladh
29a63820fd
Fixed searchstores incorrectly updating uses (#8491) 2024-07-04 22:22:44 +02:00
Vincent Stumpf
4f2beac029
Clear start_items when reading a new value (#8493)
Fixes #8492
2024-07-04 21:50:40 +02:00
Carlosgrr
529d8fea3d
Reverting Magic Wand Quest to request Trunks (#8473)
Fixes #8465
2024-07-04 20:33:14 +02:00
Lemongrass3110
d2cb6c10e1
Fixed packets 0x440 and 0x8cf (#8486)
Follow up to d445497

Fixes #8478

Thanks to @gmragnarok, @LadyNanuia and @Haydrich
2024-07-04 19:29:00 +02:00
Atemo
fccf328a54
Implemented new items up to July 3, 2024 (#8488)
* Sorted the item IDs
* Added prt_mk map in mapcache
2024-07-04 15:27:17 +02:00
Lemongrass3110
25b9126644
Refactored get/set unitdata (#8483)
Fixes #8481

Thanks to @Hyroshima
2024-07-03 17:05:15 +02:00
Lemongrass3110
2206d1a960
Fixed NoNearNPC flag (#8487)
Fixes #8471

Thanks to @xVaan
2024-07-03 16:02:22 +02:00
Atemo
1d8dec4b72
Uncommented quest ID related to illusion investigation (teddy bear) (#8477) 2024-06-30 19:05:43 +02:00
Atemo
995a5d0f60
Corrected barter shop of illusion dungeon (#8472)
Follow-up 5ca7aee79b
Fancy_Flower can't be refined.
2024-06-29 17:08:08 +02:00
Pokye
5ca7aee79b
Correction of illusion dungeon's barter shop (#8470) 2024-06-29 15:16:12 +02:00
Vincent Stumpf
73b878db37
Add expanded 4ths to jobmaster (#8267) 2024-06-28 21:39:00 +02:00
Atemo
14a22de993
Added missing clear cutin (#8467)
Corrected encoding of some files
2024-06-28 20:20:49 +02:00
Atemo
0057d862af
Initial release of Illusion of Teddy bear (Walkthrough conversion) (#8459)
* Increased MAX_BARTER_REQUIREMENTS to 6
* Fixed #6460
2024-06-28 17:36:29 +02:00
akaineko
82d3b078c3
Fixed rand issue in KO job quest (#8463) 2024-06-28 15:01:15 +02:00
Atemo
88e3eba8cf
Updated instance_check_party script command (#8457)
* The command now returns 0 if the party id does not exist
* Fixed #8426

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-06-27 18:23:03 +02:00
Lemongrass3110
c8935ef18a
Official conversion of lasagna warps (#8464) 2024-06-27 09:16:33 +02:00
Pokye
fa5e642d4d
Initial implementation of Shopping Boards (#8453)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Daegaladh <daegaladh@shadowgames.es>
2024-06-26 20:50:14 +02:00
Daegaladh
549fc3f860
Fixed searchstores and added a map parameter (#8456)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-06-26 20:21:26 +02:00
Playtester
30f8cb1f6e
Star Gladiator Miracle Chance (#8460)
- Reduced default chance of Miracle to occur from 0.02% to 0.005%
- Chance of Miracle to occur is now further reduced if AGI is above 46
- Fixes #8445
2024-06-26 11:38:46 +02:00
Atemo
21359386be
Exported constants for setdialogalign script command (#8458)
Follow-up eb308dcad2
2024-06-25 17:27:33 +02:00
Playtester
861833bcfa
Frost Joke / Scream on Party Members (#8455)
- Base chance of Frost Joke / Scream to cause status changes to party members is now one fourth of the original chance
- Variable duration of Frost Joke when applied to party members is now always 15s
- Fixes #8454
2024-06-22 22:22:44 +02:00
Daegaladh
a0bec6a404
Configs for account names, character names, and passwords minimum length (#8448) 2024-06-21 20:36:21 +02:00
Daegaladh
5123704795
Added player permission script commands (#8450) 2024-06-21 19:12:01 +02:00
Atemo
d344caa08d
Implemented NPC_DEADLYCURSE2 and NPC_DEADLYCURSE (#8447)
* Implemented NPC_DEADLYCURSE2
* Splash skill inflicting no damage and activating the status "Deadly_Defeasance" on surrounding target
* Unknown if the duration scale with level. The duration at level 5 is 30s

* Implemented NPC_DEADLYCURSE
* There is not much information on this, assuming it is a single target skill
* Does not deal any damage
* No info on max level, monsters use it level 1
* Duration at level 1 is 15s

* Uncommented NPC_DEADLYCURSE2 in mob_skill_db
2024-06-21 14:48:26 +02:00
Lemongrass3110
1ca634df1d
Packet cleanups - const and casts (#8422) 2024-06-20 14:33:47 +02:00
Playtester
5f16a06f2f
Renewal Bowling Bash Knockback (#8449)
- Fixed Bowling Bash causing knockback effect twice in renewal (fixes #8435)
2024-06-20 07:59:21 +02:00
Playtester
566ac2078d
Guillotine Fist SP Recovery Prevention Cleanup (#8443)
- Unified code for SC_EXTREMITYFIST
  * It stops natural SP recovery for 300s in pre-re
  * It stops natural SP recovery and recovery from items for 3s and shows icon in renewal
- Removed SC_EXTREMITYFIST2 as it's no longer needed
- Fixed an issue that caused a natural SP regen tick to happen right after using Guillotine Fist
- Fixes #8377
2024-06-19 07:53:30 +02:00
eppc0330
d191c2cf2a
Item DB corrections / implemented ALL_RAY_OF_PROTECTION (#8394) 2024-06-18 15:08:54 +02:00
Atemo
4555e7c14c
Updated max RES/MRES and max RES/MRES ignored (#8442)
* Removed the limit of RES/MRES and remove max_res_mres_reduction battle config
* Added a limit of RES/MRES ignored by items and skills in max_res_mres_ignored battle config
2024-06-18 15:04:37 +02:00
Lemongrass3110
ba5221ef97
Added 4th jobs to ea_job_system.txt (#8440)
Fixes #8431

Thanks to @Pokye
2024-06-17 20:15:54 +02:00
Atemo
ce5de23874
Updated get_bosstype and UMOB_MODE (#8439)
* Updated mob_data::get_bosstype() to use current mob data instead of db data to fix issue when the mode is changed via the setunitdata script command.
* Added unit_refresh in UMOB_MODE to refresh the mini icon near the monster indicating the monster type.
2024-06-17 19:38:00 +02:00
Lemongrass3110
44fbe3940d
Fixed pin code changing (#8438)
Fixes #8430

Thanks to @gmragnarok
2024-06-17 19:04:21 +02:00
Lemongrass3110
68f8a4bc7f
Fixed a crash with unknown packets (#8437)
Fixes #8432

Thanks to @gmragnarok
2024-06-17 18:30:43 +02:00
Atemo
6451925430
Updated npcspeed, npcwalkto and npcstop script commands (#8354)
* Added the optional parameter <npc name> to npcspeed to change the walking speed of the npc with the said name.
  Usage : npcspeed( <speed value> {,"<npc name>"} );

* Added the optional parameter <npc name> to npcwalkto to move the npc with the said name at the given coordinates.
  Usage : npcwalkto( <x>,<y> {,"<npc name>"} } );

* Added the optional parameters `<npc name>` and `<flag>` to `npcstop` to stop the movement of the npc with the said name with options.
  Usage : `npcstop( {"<npc name>", {"<flag>"}});`

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-06-16 14:57:59 +02:00
Playtester
fcf74b0dfc
Renewal Simple Defense Formula Flag (#8429)
- Added a flag "SimpleDefense" to mark skills that use the simple defense formula
  * Simple defense: Damage is flat reduced by DEF+DEF2. Res is ignored.
- Dragon Breath / Water now also ignore Res
- Fixes #8419

Special thanks to everyone who helped testing all these skills to confirm this common rule.
2024-06-15 20:28:26 +02:00
Lemongrass3110
8c4d1bb0c6 Fixed returning to char-select
Fixes #8420

Thanks to @gmragnarok and @Beginerxx
2024-06-13 15:24:53 +02:00
Jittapan Pluemsumran
503f9e09f6
Always set all item data in npc_sellist_sub (#6429)
Fixes #6422

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-06-13 00:47:04 +02:00
Lemongrass3110
8f9b0b8354
Added configs for instance limitations (#3753)
Fixes #1661

Thanks to @admkakaroto
2024-06-12 23:36:33 +02:00
Playtester
84cdc9cae0
Cannon Ball Skills (P.ATK and Res) (#8415)
- When using Cart Cannon or Arm Cannon, the arrow attack you get from cannon balls is no longer affected by P.ATK
- Cart Cannon and Arm Cannon are no longer reduced by Res
- More consistent naming (PATK -> P.ATK, SMATK -> S.MATK)
- Added a general rule that cannon ball attack is not added to equip attack
- Fixes #8380
2024-06-12 18:59:05 +02:00
Lemongrass3110
34eb4be25b
Preparatory cleanup of parties (#8418) 2024-06-12 15:39:24 +02:00
Lemongrass3110
9c9dcc8cab
Preparatory cleanup of guilds (#8417) 2024-06-12 14:47:52 +02:00
Lemongrass3110
aaa9890470
Preparatory cleanup of clans (#8416) 2024-06-12 10:03:44 +02:00
Lemongrass3110
6fdaac4a75
Added pincode state tracking (#8412)
Fixes #6595

Thanks to @Danil0v3s
2024-06-11 21:50:16 +02:00
Daegaladh
0d3550e7ea
Fixed clif_move to use the correct movement packets (#8405)
* Removed unused ZC_NOTIFY_MOVE (0x86) packet
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-06-11 00:03:43 +02:00
Daegaladh
6ca99e7852
Fixed potentially dangerous map_addflooritem calls and related behaviors (#8360)
*Removed potentially dangerous map_additemfloor calls
*Added weight/inventory checks for marry atcommand
*Fixed overweight message for box items
*Fixed inventory space check for box items to match official requirement (the total number of the items the box will give you *r min 10, plus 1)
*Fixed inventory space message for box items
*Fixed pet egg creation not deleting the pet data when failed to add it to the inventory
*Fixed pet egg creation dropping the egg on the floor when failed to add it to the inventory
*Fixed pet equipment dropping on the floor when failed to retrieve the item
*Added a battle configuration to prevent removing the pet equipment (and disappear into nothingness) when failed to retrieve the item
*Added missing skill_drop_items_full checks on several skills (official behavior makes the items disappear)
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-06-10 22:44:19 +02:00
Jittapan Pluemsumran
9267c2bf8a
Added sanity checks to pincode decryption (#8404) 2024-06-10 22:03:49 +02:00
Vincent Stumpf
92722db3ab
Fix dynamic npc timer mismatch (#8265)
* Fix dynamic npc timer mismatch

Fixes #8241
This adds some missing placement news that I'm surprised hasn't blown up yet.
2024-06-10 21:11:19 +02:00
Playtester
6daa032144
Renewal Spiral Pierce, Element vs. Status Attack (#8411)
- When using Spiral Pierce the base damage will now be multiplied with 0.7
- Weight bonus of Spiral Pierce is no longer affected by elemental adjustments
- Size modifiers updated: Small 130%, Medium 115%, Large 100%
- Spiral Pierce will now store its base damage in equipAtk to prevent rounding errors (temporary solution)
- Status Attack will now first apply the elemental table before doubling the right-hand damage
- Fixes #8410
2024-06-10 16:56:59 +02:00
Aristeus09
17a6d039d9
Fixed a couple of clif_message constant values (#8407)
Co-authored-by: Daegaladh <daegaladh@shadowgames.es>
2024-06-07 19:48:17 +02:00
Playtester
ec9a5fae4b
Monster Loot / Item Dropping Position (#8347)
- When a monster is killed, its first item will now always drop at the exact cell the monster was on
- When a monster drops more than one item, the items will be deployed on 3 cells around the monster (looping): SE, W and N
- Fixed drop position of looted items (similar to regular drops but independent to it and starts north)
- Fixed item drop order (script-granted -> regular drops -> looted drops)
- Fixed looted items showing special drop effects
- Searching for a free cell to drop an item on now uses the official algorithm
- When a monster drops an item, it will no longer drop on cells that are occupied by characters or pets
- When a player drops an item, it will now drop in a 5x5 area around the player
- Items dropped by players can now stack on the same cell unless the new "item_stacking" config is disabled
- When an MVP drop drops to the floor because the player's inventory was full, it will now always drop on that player's cell
- Fixes #8345
2024-06-07 18:29:01 +02:00
Playtester
e8f1c7f9e7
Triple Attack vs. Plant Mode (#8403)
- Triple Attack will now deal 3 damage to monsters with plant mode (infinite defense)
2024-06-06 21:13:48 +02:00
Lemongrass3110
4c1b1c1a5c
Added missing conformance mode in MSVS (#8402)
Follow up to 1361e9c
2024-06-06 13:10:47 +02:00
Atemo
ed3f418d15
Item data corrections (#8390)
* Fixed items in DB using wrong field. Some fields don't work with certain item types.
* Added warnings when a type is using a wrong field.
2024-06-05 15:34:14 +02:00
Lemongrass3110
c74ad5c8c2
Fixed PCBLOCK_EQUIP (#8399)
Fixes #8398

Thanks to @nubspixel
2024-06-04 10:02:14 +02:00
Lemongrass3110
48b4623f3e
Fixed all warnings in MSVS (#8391)
Fixes #2859
Fixes #3570
Fixes #8389
2024-06-04 03:07:16 +02:00
Lemongrass3110
660b194ade
Changed droplists from ERI to STL (#8370) 2024-06-04 02:40:55 +02:00
Playtester
23e7e1f367
Fixed Random Spawns (#8397)
- Fixed monsters with random spawn location to sometimes spawn on (0,0) if that cell is not a wall
- Follow-up to 5d232db
2024-06-03 19:48:55 +02:00
Playtester
1c96180fe6
Night Watch Job Bonus, Crimson Revolver (#8396)
- Fixed Sta bonus of Night Watch job
- Fixed Crimson Revolver giving 35 ATK too much
2024-06-03 16:58:31 +02:00
Lemongrass3110
545417ef11 Follow up to 1b9e46b
Fixes #8392

Thanks to @Beginerxx
2024-06-01 15:54:19 +02:00
idk-whoami
f60a4bdfaf
Corrected script for some item #28 (#8340) 2024-05-31 17:10:01 +02:00
Daegaladh
1f9a43c9d2
Replaces more constant names with the official ones (#8374)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-05-31 14:51:59 +02:00
Lemongrass3110
1b9e46b247
Generic cleanup of packets (#8369)
Standardized initial packet length of dynamic packets to sizeof
Standardized normal casts of packet_buffer to reinterpret_cast
Standardized packet length incrementations to static_cast with decltype
Removed unused function clif_setdisguise
Fixed an issue with string length in clif_scriptmenu
Removed struct keywords
Resolved a few warnings
2024-05-31 14:28:40 +02:00
BotGigo
4e77ada895
Illusion of underwater cooldown (#8383)
Corrected the quest menu for Illusion of underwater daily quests
2024-05-29 20:49:31 +02:00
Playtester
98eaf85a90
Arch Mage, S.MATK, Warlock Summon/Release (#8386)
- Fixed job stat bonuses of Arch Mage
- Fixed damage formula of Summon Elemental Ball / Release 2
- S.MATK is now applied before skill ratio
- Fixes #8381
2024-05-29 09:04:23 +02:00
Playtester
19f94e18f0
Renewal Guillotine Fist, Counter Slash, Shield Press Damage (#8376)
- Fixed the "constant addition" damage bonus being applied before the ratio in renewal, resulting in way too high damage for Guillotine Fist, Rapid Smiting and Shield Press
- Guillotine Fist is now reduced by SoftDEF+HardDEF in renewal
- Guillotine Fist is no longer reduced by Res
- Fixed Counter Slash adding Agi and Job Level to base damage rather than skill ratio
- Fixed Shield Press multiplying the damage by 5 instead of dividing it among 5 hits
- Only base STR of players will increase the Shield Press skill ratio now
- The fixed VIT*REFINE damage bonus of Shield Press is now a bonus that is applied even on MISS
- Fixes https://github.com/rathena/rathena/issues/8363
2024-05-28 22:47:06 +02:00
Daegaladh
3b5b5be574
Fixed compile warning (#8384) 2024-05-28 15:59:45 +02:00
Akkarinage
39644a980f
Removed whitespace & duplicate label in runserver.bat (#8385) 2024-05-28 14:48:58 +01:00
Lemongrass3110
924d1ddad7
Fixed clif_clearchar_skillunit (#8371)
Follow up to cc60c46
2024-05-27 01:00:25 +02:00
Lemongrass3110
79935a75c9
Updated Hercules packets (#8368) 2024-05-26 17:31:23 +02:00
eppc0330
9e2b0b4a4d
New pcblock flag PCBLOCK_EQUIP (#8367) 2024-05-26 15:43:32 +02:00
Daegaladh
05ced985e3
Replaced custom with official message names (#8361) 2024-05-26 13:17:05 +02:00
Atemo
cc60c46e5f
Converted some packets to structs (#8353)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-05-25 22:17:12 +02:00
Playtester
b4ae40d401
Synchronize Damage Feature (#8305)
- Added a new monster stat "ClientAttackMotion" to mob_db.yml which is the time from when a monster attacks until which the damage shows on the client at 1x speed
- Added a new config synchronize_damage; when set to "yes", the client will display the damage of normal monster attacks at the exact time it is applied on the server, removing position lag (fixes #259)

Special thanks to all people who worked together to make this possible.

Co-authored-by: aleos, Lemongrass3110, Atemo
2024-05-25 18:59:22 +02:00
Lemongrass3110
023263df7d Fixed another crash in clif_wis_message
Follow up to 7ddd035 and a44d954

Fixes #8359

Thanks to @gmragnarok
2024-05-25 15:31:30 +02:00
Pokye
7c017bac6a
Missing nodynamicnpc on mapflag (#8357)
Fixes #8356
2024-05-24 15:28:07 +02:00
Atemo
361530a1b6
Converted some packets to structs (#8351) 2024-05-21 21:28:01 +02:00
Atemo
d1cf6f4ac7
Converted some packets to structs (#8332) 2024-05-20 21:13:59 +02:00
Playtester
c83f41a5a3
Consistent Dirx / Diry Array Usage (#8343)
- All skills now use the globally defined dirx/diry variables instead of defining their own
2024-05-20 09:14:18 +02:00
Playtester
5d232db89e
Spawn and Free Cell Search Behavior (#8324)
- When searching for a map-wide free cell, the tiles 15 cells from the edge are no longer considered
  * Added a configuration to change the edge size to any value between 1 and 40
- When searching for a free cell, the tiles 4-5 cells from the edge are now considered invalid and trigger a retry
  * If you make the edge size smaller than this, it will use edge size instead
- Searching for a free cell now defaults to 50 tries, but if the "no spawn on player" option is active, those failed attempts are not counted towards the limit anymore
- When a monster spawns in a defined area there will now be 8 attempts to spawn it on a valid cell within the area and then one attempt on the center cell; if all 9 attempts fail, there will now be 50 tries to spawn it map-wide before it gives up
- When a monster has fixed spawn coordinates, but those coordinates are a wall, it will now spawn in a random location map-wide instead
  * This also applies to icewall blocking the cell unless the boss_monster command was used
- Each monster in an area spawn will now receive its own spawn center within the spawn area on server start
  * This results in the spawn area being larger but having a bias towards the center
  * Added a configuration to disable this behavior
- Fixed slave monsters always being active and constantly calling the "search freecell" function even though neither them nor their master have been spotted yet
- Fixed map server crash when setting no_spawn_on_player to 100 (follow-up to 33b2b02)
- Updated prontera field spawns to official episode 18+
- Updated all champion mob respawn times to 3 minutes and sorted them by map name
- Fixes #8300
2024-05-19 17:12:44 +02:00
eppc0330
949a33081f
Fix slavemob bahavior (#7978)
Fixes #6885

Co-authored-by: aleos89 <aleos89@users.noreply.github.com>
2024-05-19 14:10:23 +02:00
Aleos
b81904d554
Update build_servers_gcc.yml (#8338)
Add a separate job to run specifically for GCC 13 in Ubuntu 24.04 as the package was removed from Ubuntu 22.04.

Related issue actions/runner-images#9866
2024-05-18 13:40:43 +02:00
mettool
aa62b2fa80
Corrected Boss Meow monster Class (#8336) 2024-05-17 14:52:13 +02:00
Kanin Temsrisuk
4327fb05a9
Corrected RG Golden Potion item data (#8286) 2024-05-17 14:50:42 +02:00
Akkarinage
e1e8b68b33
Updated checkout version tag 2024-05-15 19:38:03 +01:00
Akkarinage
91b501bbb2
Added Siege_Teleport_Scroll2 function 2024-05-15 14:24:36 +01:00
eppc0330
a9a8b0d0c4
Fixed plagiarized skills not removed (#8329) 2024-05-14 09:10:03 +02:00
Lemongrass3110
da8229b8f5
Added some suggested code improvements (#8331)
Fixes #8309

Thanks to @mrpond
2024-05-13 17:46:47 +02:00
Lemongrass3110
8980203f7b
Small cleanup to NJ_ZENYNAGE (#8320)
Split NJ_ZENYNAGE from KO_MUCHANAGE
2024-05-13 16:50:30 +02:00
Lemongrass3110
fe9f617f97
Fixed clif_sendfakenpc (#8330)
Fixes #8321
Fixes #8328

Thanks to @kaninhot004
2024-05-13 11:45:00 +02:00
Lemongrass3110
580511c0bb Fixed a warning
Fixes #8325

Thanks to @Beginerxx
2024-05-13 07:44:36 +02:00
Playtester
f85ca81066
Fixed Magic vs. Plant Damage (#8323)
- Fixed magic damage on plants always being 0
- Follow-up to 2963e52
2024-05-11 08:52:39 +02:00
Playtester
04117614cb
Attacking While Casting Crash Fix (#8322)
- Fixed a server crash that occurs when a unit did a normal attack while casting a spell (e.g. Free Cast)
- Follow-up to ffe40de
- Fixes #8319
2024-05-10 18:19:19 +02:00
Lemongrass3110
04386a8ebc Follow up to d445497 2024-05-10 00:12:10 +02:00
Jittapan Pluemsumran
d445497870
Converted a bunch of packets to structs (#8295)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-05-09 23:06:32 +02:00
jasonch
1af1943f85
Added missing columns for yaml2sql (#8318)
Fixes #8317
2024-05-09 22:00:17 +02:00
Playtester
13bc3e2bb7
Monster Powerskill Levels, Silver Sniper, Magic Decoy (#8316)
- Fixed some monsters using the normal player level 10 version of a skill instead of the special NPC powerskill version (e.g. Heal for 9999 HP)
  * See doc/mob_skill_db_powerskill.txt for more information
- Fixed Silver Sniper and Magic Decoy using Heal 10
- Fixed Magic Decoy doing normal attacks
- Fixes #8306
2024-05-08 15:08:09 +02:00
Playtester
ffe40def4a
NPC_RUN, Monster Skill Interval (#8302)
- Monsters will now properly run away when using NPC_RUN (fixes #7941)
- Introduced a new function unit_get_walkpath_time that returns the time the unit needs to walk its current walkpath
  * This is now used for NPC_RUN and random walking
- Fixed an issue with mismatching timer warnings when a monster casts NPC_RUN multiple times in row

- Monsters will now always attempt to use non-berserk-state skills once per second (fixes #1700)
  * This completely replaces the "ugly" solution to use a walk_count for idle, walk and chase skills
  * This interval is now a lot more accurate and no longer influenced by external factors such as canact delay
  * This interval is now also used for lazy monsters rather than MIN_MOBTHINKTIME*10 so that MIN_MOBTHINKTIME can be reduced without having to worry about skills being cast more often
  * Angry skills no longer replace the normal attack and now follow the once per second rule; they will always first be attempted at the end of the walk delay after a normal attack
- The special follow-up attack skill monsters use when you move out of their attack range, now is only used when they are in Angry state
  * Also fixed a bug that this was checked every 100ms until the monster used a skill, instead of just once per second

- Monsters now can use chase skills even before they start moving (assuming one second has already passed since last skill check)
- Removed "hack" to make monsters cast chase skills when trapped in icewall
  * This was solved by implementing checking for chase skills before starting to move

- Monsters will now receive an aMotion walk delay after having used a skill
- A monster that could not walk randomly because of walk delay will now walk immediately once the walk delay expires
- Using angry or berserk skills will now set a monster's attack delay
2024-05-08 09:02:48 +02:00
Atemo
bcb34695a5
Updated item DB and mapcache up to may 2 2024 (#8314) 2024-05-07 17:08:29 +02:00
Banana
fd9b475446
Added a command to reload cash shop db (#3257)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-05-07 10:08:55 +02:00
Aleos
8546f9f089
Resolves a potential crash from Howling Mine (#8147)
* Fixes #8146.
* Minor cleanups to ensure the Howling Mine status is active before accessing.
Thanks to @LadyNanuia!
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-05-06 19:15:37 -04:00
idk-whoami
ffbbb94080
Corrected script for some item #27 (#8235) 2024-05-06 23:17:25 +02:00
eppc0330
c8cbc2e3a1
Fixed SHC_SHADOW_STAB damage bonus (#8288)
Fixed SHC_SHADOW_STAB damage bonus not being applied during cloaking exceed status.

Remove cloaking bonus: Bonus should be granted on only cloaking exceed status, not cloaking

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-05-06 21:22:54 +02:00
Lemongrass3110
a44d9540fb
Fixed clif_wis_message (#8308)
Fixes #8307

Thanks to @mrpond
2024-05-06 02:04:51 +02:00
Singe Horizontal
fd36fc04b2
Fixes clif_viewequip_ack packet length (#8304) 2024-05-05 15:13:06 +02:00
Lemongrass3110
b48948822a
Replaced NULL with nullptr (#8298) 2024-05-03 19:38:13 +02:00
idk-whoami
30928a04e1
Script correction of NPC ammo_boxes (#8275) 2024-05-03 17:50:01 +02:00
Lemongrass3110
3ada0c11be
Converted some banking packets to struct (#8297) 2024-05-03 13:35:20 +02:00
Kanin Temsrisuk
90b2b9cbbf
Fix auto spell list on renewal (#8299)
Follow up to 9440869
2024-05-03 10:12:31 +02:00
Daegaladh
7ddd035442
Fixed clif type conversion warnings (#8294)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-05-03 09:26:02 +02:00
Lemongrass3110
38ca0998fd
Cleaned up 2 size_t warnings in char.cpp (#8296) 2024-05-03 08:17:13 +02:00
Daegaladh
29a3c5263b
Small optimization on change sex (#8281) 2024-05-03 00:46:40 +02:00
Lemongrass3110
827517f8cf
Cleaned up a few TODOs from #7963 (#8254) 2024-05-02 22:44:31 +02:00
idk-whoami
6d2ef66bbb
Script correction of Lux Anima Runestone IDs 22540 (#8258) 2024-05-02 21:35:49 +02:00
Lemongrass3110
7ebf47e31c
Added GCC 12 and 13 to CI (#8293)
Follow up to d949740
2024-05-02 20:37:04 +02:00
Atemo
2ebdd50e08
Fixed warning about favorite item (#8290) 2024-05-02 15:35:00 +02:00
Jittapan Pluemsumran
d949740cd9
Moved battle_fix_damage definition to battle.cpp (#8292)
Fixes #8291
2024-05-02 13:56:20 +02:00
Playtester
16e9d52204
Database Cache Fix, Pre-Re Monster Cleanup (#8289)
- Fixed a problem that caused the DB cache to always be missing the last entry
- Removed renewal monsters from pre-re/mob_db.yml
2024-05-01 20:12:31 +02:00
Playtester
cad5cab976
Coma Rework, Exp Calc Type, Fiber Lock Range (#8287)
- Coma item bonus is no longer an additional effect / status change, but instead replaces the attack damage with setting HP/SP to 1
  * That means Coma attacks will never kill someone, even if the original attack would be lethal
  * When doing a Coma attack, the attack displays the original damage and this is also what counts towards the mob damage log
- Coma is checked for every single event that applies damage, including reflect damage, and for Provoke / Self Provoke
  * Some Renewal-only effects couldn't be tested and were left unchanged (e.g. damage from White Imprison)
- Coma now sets SP to 1 instead of 0
- bComaRace, bWeaponComaRace and bWeaponComaEle won't work on bosses, GVG and battlefield objects
- bComaClass and bWeaponComaClass no longer work on GVG and battlefield objects, but can work on bosses if you specify Class_Boss or Class_All
- Edge is now defined to only work on normal monster
- The default exp_calc_type 0 no longer counts the first attacker twice and instead works like on official servers
- Added a new exp_calc_type 2 that counts the first attacker twice as previously
- The damage logged will now include overkill damage on exp_calc_type 0 and 2, but not count Coma damage (it will count the damage you would have originally dealt instead)
- Fiber Lock now has a range of 9 instead of 7
- Fixes #8279
2024-05-01 08:58:51 +02:00
Playtester
9e959f7fd6
Renewal Offhand Damage, Left-hand Weapon Only Attack (#8285)
- Fixed renewal offhand damage being double as high as it should be
- You will now deal unarmed main hand damage if you equip a weapon only in your left hand
- Your offhand damage will now be the same regardless of whether you have a weapon in the main hand or not
- Fixes #8284
2024-04-27 15:55:41 +02:00
Playtester
0e434aa73b
Grand Cross Damage and Trigger Rework (#8283)
- Grand Cross on target is now considered a full magic attack and no longer triggers drain and similar effects that only work with physical attacks
  * This problem as was introduced in d8a02e9 to fix Coma not working on Grand Cross, but the reason that Coma works on Grand Cross is because it can also trigger on Magic skills (this is already working)
- Grand Cross damage on self is still considered as "physical damage received" for reactive cards (e.g. Alarm Card), but no longer as "magical damage received" (e.g. Platinum Shield does not trigger)
- Grand Cross no longer channels through the whole "weapon attack" code and just calls the necessary parts directly (it only considers ATK, DEF/VIT_DEF and refine)
- Damage parts of Grand Cross can now go below 1 and reduce the other part (e.g. -5 physical damage and 15 magical damage now results in 10 damage instead of 16)
- Implemented the official renewal damage formula for Grand Cross:
   [((ATK+MATK)/2)*RATIO - DEF - VIT_DEF - MDEF - MDEF2]
- Fixed the order of damage processing for Grand Cross for fully accurate damage (there were a lot of rounding issues before)
- The attribute table is no longer applied twice on self damage (still applied twice on target)
- Cards that increase magic damage now work with Grand Cross (e.g. Skeggiold Card)
- Changed Grand Cross range to 9 as that's the official range (you never know when it matters)
- Fixes #1140
2024-04-27 10:22:50 +02:00
Playtester
2963e52fc6
Pre-Re Monster Stats, CSV2YAML Converter, Damage Inaccuracy Fix (#8278)
- Fixed several pre-re monster stats being 1 instead of 0
  * Issue was introduced in 05a17d8 as safety measure to prevent division by 0, but it results in wrong damage numbers
  * Players can get 0 on stats as well, so it's better to put such safety measures at the point where the division takes place
- Minimum stat for monsters is now 0 instead of 1
- Monsters that have 0 Luk after this change can no longer be cursed
- Improved csv2yaml converter to no longer lose the information whether a stat is 0 or 1
- Fixed an issue with converting Race2 in the csv2yaml converter
- Removed arbitrary "+1 MATK" bonus that was probably added due to people not figuring out why the damage was off by 1
- Fixed small damage inaccuracy issue in PVP
- Fixes #8277
2024-04-24 21:04:34 +02:00
Playtester
7c44390606
Fixed Monsters Randomly Targeting on Attack (#8274)
- Fixed immobile monsters targeting random bystanders with their spells even though they already have a target
- Fixed some Malaya Port enemies targeting randomly
- Fixes #8273
2024-04-24 11:46:45 +02:00
Kanin Temsrisuk
45b588c654
Corrected Cylinder Boots [1] item script (#8268) 2024-04-22 22:55:40 +02:00
idk-whoami
5124ddf575
Modes correction of Temple Of Demon God monsters (#8259)
Thanks to @Atemo
2024-04-22 22:54:41 +02:00
Chaos92
0f0bd685d9
Fix typo for macro_register (#8270) 2024-04-22 13:26:31 -04:00
Playtester
f15cb72f94
Monster AI Improvements, Clashing Spiral, Skid Trap, Throw Stone (#8269)
- Added config setting mob_unlock_time that defines how long a monster can be trapped (immobile) before it unlocks its target 
  * Default is 2000ms, which makes Clashing Spiral no longer cause monsters to drop their target, but Ankle Snare still will even at minimum duration 
- Monsters will now promptly use idle skills while trapped (there was a delay before)
- Increased the time the AI is still active when there are no players left on the map from 0ms to 5000ms
  * This fixes an issue that monsters never unlocked their target if it was the last player to leave the map
- Clashing Spiral now has a range of 4 instead of 5
- Skid Trap no longer has a stop effect in pre-re, but it will make monsters unlock their target and become idle
- Skid Trap still stops targets for 3 seconds in renewal, but will no longer activate on bosses
- Throw Stone now deals 30 damage when used by monsters
- Fixes #7846
2024-04-22 08:39:11 +02:00
Playtester
75f518859f
Removed Basedamage Variable from Renewal (#8264)
- As this variable is unused and is very hard to calculate in renewal's structure, it was removed completely from renewal to make the renewal code cleaner
- In pre-re it still works exactly the same as before (used for the EDP and Magnum Break bonus - renewal uses weaponATK for this instead)
- Follow-up to b5e3e5e
2024-04-21 00:08:03 +02:00
munkrej
b5e3e5e69b
Fixed wrong double damage calculation for skills in renewal mode (#8260)
Note by Playtester: In renewal the "battle_calc_skill_base_damage" function adds to the ATK values rather than resetting them, so calling it twice will cause the values to be doubled, so we can't easily use this system for renewal. Will do a follow-up cleanup later.
2024-04-20 15:50:27 +02:00
Playtester
3cbdcf999f
Ankle Snare Status Rework (#8263)
- SC_ANKLE no longer has a natural resistance and minimum duration
- Glacier Fist, Clashing Spiral and Tarot Card of Fate now grant SC_ANKLE instead of SC_STOP (cannot teleport while under SC_ANKLE effect)
- Grand Cross now gives SC_ANKLE to self during the spell duration
- Ankle Snare now has a minimum duration of 3000+30*baselevel milliseconds
- Ankle Snare will no longer activate on bosses in renewal
- Fixed Ankle Snare stopping bosses in pre-renewal even if you didn't enable the config setting for it
- Glacier Fist now has a minimum duration of 1500+15*baselevel milliseconds rather than it being the maximum duration
- You can now define Glacier Fist's effective base duration in the YML file without worrying about it being halved in the source code (it is still getting reduced by Agi)
- Fixed some integer overflow issues
- Fixes #8253
2024-04-20 15:41:24 +02:00
Playtester
cd7341930e
Fixed Capping of Values (#8257)
- Values that are added together will now be correctly capped to their max value
- Status resistance can no longer exceed 100% (made negative success rates become positive)
2024-04-18 17:55:41 +02:00
Playtester
25b98c87db
NPC_INVINCIBLE and Spell Breaker (#8255)
- NPC_INVINCIBLE now grants SC_INVINCIBLE for 300s instead of unlimited
- NPC_INVINCIBLEOFF and MER_INVINCIBLEOFF2 now just end SC_INVINCIBLE instead of having their own status change
- SC_INVINCIBLE now works like plant mode instead of just setting incoming damage to 1
- SC_INVINCIBLE now increases ATKpercent by 100 instead of increasing all damage by 75%
- SC_INVINCIBLE no longer blocks skills
- SC_INVINCIBLE now increases movement speed by 50% instead of 75%
- SC_INVINCIBLE now increases ASPD strongly
- Quagmire can no longer prevent ASPD increase (it still ends various status changes and prevents them)
- If you counter Spell Breaker with Magic Rod you now receive 20% of the caster's MaxSP
- Spell Breaker will now only deal HP damage on level 5
- Spell Breaker now can deal damage to bosses to 10% in pre-re (cannot be reduced by SC_INVINCIBLE unless you enable the "invincible_nodamage" setting)
- Spell Breaker will no longer deal damage if it would be lethal
- Added missing animation of Spell Breaker's damage
- Fixes #8228
2024-04-17 16:28:04 +02:00
Atemo
5df7de2b15
Added missing sd check for clif_skill_fail (#7963)
Fixes #8239 

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-04-15 22:38:46 +02:00
Playtester
089c3056cf
Updated/Simplified Damage Bonus Stacking (#8252)
- Freezing Trap, Sand Attack, Gunslinger Mine, Flip Tatami and Excruciating Palm no longer are affected by +% dmg cards
- The skills that ignore +% dmg cards are now exactly those skills that also ignore EDP and the EDP/Magnum Break elemental damage bonus
- Non-players are now always affected by ATKpercent
- Simplified the code accordingly
- Fixes #8250
2024-04-14 19:12:40 +02:00
Lemongrass3110
d05e11aecd
Added .git-blame-ignore-revs file (#8245) 2024-04-14 19:09:36 +02:00
Playtester
310fcd6fa1
Throw skills (Shuriken, Kunai, Coins, Venom Knife) (#8249)
- Throw skills no longer consider arrow attack unless you have a ranged weapon equipped
- Throw Shuriken is no longer modified by +% damage cards
- Throw Shuriken/Kunai no longer ignore flee
- Throw Shuriken's damage bonus is now flee-ignoring and includes skill level(x4), dagger mastery(x3) and arrow attack
- Throw Kunai's damage bonus is now three times arrow attack per hit
- Throw Shuriken/Kunai's final damage is now applied as forced neutral damage
- Fixed range of Throw Coins (9 -> 7)
- Other code improvements
- Fixes #8206
2024-04-14 07:55:31 +02:00
Playtester
81894eeba6
Venom Splasher, Venom Knife (#8248)
- Venom Splasher now ignores +% damage cards, but no longer ignores weapon element
- Venom Splasher now uses the correct durations and cooldowns in pre-re (was already correct in renewal)
- Venom Splasher and Venom Knife now correctly use default poison duration
- Venom Splasher and Venom Knife now have a poison chance of 100%
- Fixes #8221
2024-04-12 21:56:39 +02:00
Playtester
9eff7be9cd
ATKpercent for monsters (#8246)
- Most NPC skills are now influenced by ATKpercent again
- LK_SPIRALPIERCE is now only not influenced by ATKpercent when used by players
- Introduced a new enum for bonus check flags
- Follow-up to 03f07ab
- Fixes #3538
2024-04-11 18:35:14 +02:00
Playtester
82c37ce32d
NPC_POWERUP, NPC_AGIUP (vs. Quagmire) and Dispel (#8243)
- NPC_POWERUP and NPC_AGIUP now grant their own unique status changes
- Duration of NPC_POWERUP is now 5s*level
- Duration of NPC_AGIUP is now 10s*level and max level is back to 10
- Quagmire, Slow Grace and Adoramus now work even when the target used NPC_AGIUP
- NPC_AGIUP will remove Decrease Agi on start but will not prevent it
- NPC_AGIUP can be dispelled, but NPC_POWERUP cannot
- Dispel will now make a monster unlock its target
- Removed custom code to display the NPC_POWERUP effect, it's now correctly linked to EFST_POWERUP
- Removed the ifdef around EXTREMITYFIST2, so we no longer constantly change its ID
- Fixes #8242 
- Fixes #904 
- Fixes #7346
2024-04-10 18:34:49 +02:00
Atemo
c70bc39751
Implemented SC_PERIOD_RECEIVEITEM_2ND and SC_PERIOD_PLUSEXP_2ND (#8197) 2024-04-10 14:01:12 +02:00
Playtester
eb4658f940
Envenom Element Modifier Adjustments (#8237)
- Envenom now applies the attribute table to the final damage again (fixes #8212)
2024-04-09 17:09:23 +02:00
Playtester
03f07ab8c7
Various NPC skill fixes (#8233)
- Fixed the damage type of various NPC skills
- NPC_*BREATH skills and NPC_VAMPIRE_GIFT will now no longer be influenced by ATKpercent
- Fixed NPC_CRITICALSLASH not working in pre-re
- NPC_KEEPING now lasts 30s
- NPC_BARRIER now lasts 15s
- NPC_DEFENDER now lasts 15s, reduces damage by 87.5% and halves movement speed
- Fixes #3538
2024-04-08 20:24:32 +02:00
Atemo
100b590094
Corrected SC_HELPANGEL (#8220)
Heal amount of SC_HELPANGEL (NV_HELPANGEL skill) is now not displayed.
2024-04-08 13:30:28 +02:00
Lemongrass3110
cb42dceb87
Switched most C headers to C++ (#8225) 2024-04-07 22:14:51 +02:00
Playtester
8cec8ce560
Minor trap damage fixes (#8230)
- Freezing Trap is now calculated like a ranged attack when the user has a bow equipped
- Fixed some minor trap damage inaccuracies
- Fixes #8227
2024-04-06 20:56:09 +02:00
Playtester
537072e610
Star Crumbs, Spirit Spheres, EDP, Guillotine Fist, Sand Attack, Rapid Smiting, Clashing Spiral (#8219)
- ATKpercent, Spirit Spheres and other mastery bonuses, now all affect the exactly same skills with some exceptions for refine and Star Crumbs, see battle_skill_stacks_masteries_vvs
- EDP and elemental bonus damage now apply to the exact same list of skills, see battle_skill_stacks_edp_element (pre-re)
- Star Crumbs and Spirit Spheres no longer multiply the damage by number of hits twice
- Star Crumbs, Spirit Spheres and similar mastery bonuses that apply even on MISS are now applied after the attribute table but before EDP and elemental bonus damage (pre-re)
- Attribute table can now make damage go negative which is weighted against any of the above mastery bonuses and elemental bonus damage before being capped to 0
- EDP and elemental bonus damage no longer apply to the left hand; removed "basedamage2" as it is no longer needed
- Left-hand damage is now always capped to 0 instead of 1
- Fixed Guillotine Fist ignoring size modifiers
- Fixed inaccuracies in Guillotine Fist's damage due to rounding issues
- Fixed bonus damage from Magnum Break when using Guillotine Fist
- Sand Attack is no longer influenced by EDP
- Rapid Smiting now has a fixed 20% hit bonus (it hits at least to 25%)
- Rapid Smiting no longer deals damage on MISS
- Clashing Spiral damage is no longer influenced by ATKpercent and any mastery except Star Crumbs
- Further code improvements / compiler warning fix
- Fixes #8211 
- Fixes #8218 
- Fixes #7750 
- Fixes #1823
2024-04-06 18:31:40 +02:00
Atemo
c546e67995
* Fixed an issue with some group in item group DB renewal (#8224)
* Replaced getrandgroupitem by getgroupitem script command
* Fixed incorrect use of getrandgroupitem in NPC folder
2024-04-06 13:49:31 +02:00
Lemongrass3110
8745391ad4
Cleaned up ZC_INVENTORY_TAB (#8217)
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2024-04-04 08:42:19 +02:00
Atemo
4f82aff8fd
Initial release of episode 18.1 (#7917)
Thanks to @idk-whoami
2024-04-02 17:43:25 +02:00
Lemongrass3110
9440869743
Cleaned up ZC_AUTOSPELLLIST (#8216)
Cleaned up code.
Fixed invalid allocations from the old code.
Changed to struct.
Use correct packet id.
Fixed invalid RENEWAL check instead of PACKETVER.

Thanks to @aleos89
2024-04-02 16:06:56 +02:00
RoboSchmied
3c1187e150
Fix typos in BUILD messages (#8199) 2024-04-02 11:32:57 +02:00
Lemongrass3110
349b04bf28
Cleaned up CZ_PARTY_CONFIG (#8204)
Thanks to @aleos89
2024-04-02 09:53:11 +02:00
Playtester
b0902a4142
Volcano and Min Damage (#8213)
- Volcano now increases BaseATK instead of WeaponATK for non-monsters
- Fixed a bug that caused Volcano to increase MATK in pre-re (fixes #8208)
- Fixed min damage not being set correctly
- Fixed a compiler warning
2024-04-01 18:35:44 +02:00
Playtester
4247bc50c5
ATKpercent, Base Damage, Occult Impaction, Freezing Trap, Acid Terror, Paladin skills (#8210)
- A handful of skills grant status changes that actually are calculated together into a value "ATKpercent" rather than increasing BATK/WATK, this value is then applied to most weapon skills
  * Pre-re - Damage after skill ratio but before DEF reduction is multiplied with ATKpercent
  * Renewal - Is a linear addition to skill ratio instead (ATKpercent of 200 means +100% to any skill ratio, so 100% becomes 200%, but 500% only becomes 600%)
  * For further information which status changes go into ATKpercent and which skills are not influenced by it, please see the battle_get_atkpercent function
- Fixed base damage not being calculated correctly for certain skills
- MO_INVESTIGATE is no longer influenced by Spirit Spheres except when you have the WATK_ELEMENT effect (Magnum Break)
- Freezing trap now deals 100% damage on all levels and can miss
- Acid Terror now ignores DEF, but its base attack is reduced by VIT
- Acid Terror skill ratio is now 50%+50%*level
- Acid Terror and Martyr's Reckoning (PA_SACRIFICE) are no longer affected by refine and mastery bonus
- Magnum Break/EDP bonus no longer affects Acid Terror and unit skills
- Fixed damage formula of Shield Boomerang and Rapid Smiting
- Code improvements
- Fixes #8193
2024-04-01 15:15:41 +02:00
Atemo
23787bdfa4
Updated renewal item group DB (#8207)
* Corrections in item group DB
* Implemented new groups
2024-03-31 18:37:39 +02:00
Playtester
8a109071a5
Fixed Sonic Blow related map server crash (#8203)
- Fixes #8202
- Follow-up to 7d9a23d
2024-03-29 19:28:55 +01:00
Playtester
43d4e071df
Critical Hits on Focused Arrow Strike and Gunslinger (#8201)
- Focused Arrow Strike no longer deals max damage when it crits (pre-re)
- Focused Arrow Strike no longer considers cards that increase/decrease critical damage (pre-re)
- Criticals with any guns are now calculated like melee criticals, not considering bullet attack (pre-re)
- Chain Action can no longer do critical hits (pre-re)
- Fixes #8200
2024-03-29 18:43:09 +01:00
Playtester
7d9a23d03f
Frenzy, Super Novice Level Up Buff, Assassin Soul Link (#8198)
- Fixed Frenzy HP drain interval being 15 instead 10 seconds in renewal (follow-up to 1a004f0)
- The buffs granted when a Super Novice levels up now all last 120 seconds (fixes #8189)
- Assassin Soul Link now doubles stun chance outside GVG/BG (fixes #8195)
2024-03-28 23:43:59 +01:00
Playtester
861832ec27
Enchant Deadly Poison / Magnum Break Damage Bonus and Durations (#8191)
- Added missing EDP 25% poison damage bonus (it was already fixed in renewal but applies to pre-re too), that works identical to the 20% fire damage bonus from Magnum Break; both buffs overwrite each other
- The damage on which EDP/Magnum Break is based on now considers defense reduction, passive mastery, refine and true sight
- The EDP/Magnum Break damage bonus now considers spirit sphere damage, but the spirit sphere part is non-elemental; both are added together before they get rounded down
- The EDP/Magnum Break damage bonus can now become negative through attribute table and is dispelled on logout
- The EDP/Magnum Break damage bonus no longer applies when damage is already 0 or lower beforehand
- EDP is now applied after defense, refine and mastery
- Refine bonus now is applied before mastery and between both the damage is capped to 1
- Envenom's fixed damage bonus is now a mastery bonus (was already fixed in renewal but applies to pre-re too) and thus increased by EDP
- Fixed damage interaction between MO_FINGEROFFENSIVE (Throw Spirit Sphere) with Magnum Break, refine and spirit spheres
- Fixed Magnum Break costing HP; it requires HP but does not consume it
- Fixed Sonic Blow's damage formula (300%+50%*skill_lv) and how the bonus from Sonic Acceleration works (+10% to ratio)
- Poison/DPoison now reduce hard DEF vs. monsters by 25%, but the DEF reduction no longer stacks
- Fixed DPoison's duration (60s base duration on all levels)
- Fixed Enchant Deadly Poison duration in Renewal
- Fixed chance of DPoison to be inflicted (3% level 1+2, 4% level 3+4, 5% level 5)
- Fixed negative resistances not increasing the chance of a status change to occur (it's only capped to 0 in renewal)
2024-03-28 22:46:22 +01:00
Atemo
2633599458
Implemented missing renewal items usable (#8190) 2024-03-28 00:37:40 +01:00
Playtester
1a004f0164
Mercenary, Regen and Frenzy Improvements (#8185)
- When a Mercenary gains a bonus, there will now be an animation
- Mercenary bonuses now last for 5 minutes instead of 10 minutes
- Fixed HP/SP recovery values of Mercenaries (and Elementals)
- Mercenaries now recover HP when walking
- Homunculi no longer recover SP when walking
- Mercenary natural recovery interval is 8s for HP and 6s for SP
- Homunculus natural recovery interval is 2s for HP and 4s for SP
- MER_CRASH now only deals 1 hit and can be cast-cancelled
- Frenzy now drains HP every 10 seconds instead of every 15 in pre-renewal
- Fixed SP cost Mercenary Frenzy (100 -> 200 SP)
- Killing monsters exactly 2 times below you base level now still counts as mercenary kill
- Fixes #8184 
- Fixes #7663
2024-03-27 11:48:05 +01:00
Atemo
ed2d03d811
Extended TimeLimit format (quest DB) (#8116) 2024-03-25 19:09:31 +01:00
Atemo
42bd87d9b7
Implemented the permission "TRADE_UNCONDITIONAL" (#8182)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-03-25 16:09:11 +01:00
Playtester
dd663c7eb4
Fixed Asprika damage reduction (#8173)
- Monster damage is now always reduced by items that reduce BF_WEAPON damage
- Monster damage is now never reduced by items that reduce BF_MAGIC damage
- Asprika now reduces all damage from monsters by 30%
- Asprika now reduces all physical damage from players by 30%
- Asprika now reduces damage regardless of range of the attack
- Shaman Hat will no longer reduce damage from monsters, but will still reduce magic damage from players
- This also affects all custom items using bonus3 bSubEle and bonus3 bSubRace
- Added a config to battle/items.conf to return to old behavior
- Fixes #8171
2024-03-24 21:32:49 +01:00
Atemo
34711b5307
Implemented new items up to 20-03-2024 (#8180)
* Removed duplicate IDs
2024-03-22 21:42:16 +01:00
Atemo
b71586b3ca
Item DB corrections (#8179)
* Corrected etc items with item script (shouldn't happen)
* Corrected some item type
2024-03-22 20:48:53 +01:00
Atemo
3627377d49
Updated items DB (#8178)
* Updated items Trade, Flags, EquipLevelMin, ArmorLevel, WeaponLevel, Slot and Gradable
2024-03-22 19:52:30 +01:00
Atemo
5ebfd54163
Updated item_packages.yml and item_group_db.yml (#8174)
Files updated according to KRO client datas.
2024-03-17 14:48:28 +01:00
Playtester
f85f990e3e
Fixed all status changes overwriting OPT1 status changes (#8172)
- Fixes #8128
2024-03-16 14:42:45 +01:00
Atemo
f55e29068a
Updated pet_db.yml (#8170)
* Updates pet_db.yml based on KRO client data.
2024-03-15 14:58:52 +01:00
Atemo
a768af85ee
Updated geteleminfo script command (#8168)
* Updated geteleminfo script command
* Added a new <type> "2" that returns the class ID of the elemental spirit
* Fixed Dimensions Elemental* combos: item descriptions require high elemental spirit check
* Added new constants for geteleminfo

Thanks to @aleos89 @Badarosk0 !
2024-03-14 14:08:45 +01:00
Atemo
872e31cc8d
Updated NPCs list and mobs list according to KRO client (#8167) 2024-03-13 14:39:45 +01:00
Atemo
0536323882
Updated the Name of some items in item DB (#8166)
* Updated the "Name" of some items in item DB according to https://www.divine-pride.net/
* Truncated "Shinkiro & Shiranui Soul (Huuma Shuriken - Construct)" item name to 49 character
2024-03-13 00:23:16 +01:00
Atemo
43eece8628
Implemented new items up to March 6 2024 (#8165) 2024-03-12 15:12:41 +01:00
Atemo
3e82cf45a6
Rebalance Night Watch 2024-02-05 (#8164)
* Hidden Card
- No longer be removed by Dispell or Clearance.

* The Vigilante at Night
- Increases AP recovery rate from 1 to 2.

* Only One Bullet
- Increases AP recovery rate from 1 to 2.

* Spiral Shooting
- Increases AP recovery rate from 1 to 2.

* Magazine for One
- Increases AP recovery rate from 1 to 2.

* Wild Fire
- Increases AP recovery rate from 1 to 2.
2024-03-11 19:55:23 +01:00
Atemo
4a3149649e
Rebalance Abyss Chaser 2024-02-05 (#8153)
* Abyss Slayer
- Reduces AP consumption from 150 to 120.

* Omega Abyss Strike
- Reduces fixed casting time from 1.5 seconds to 1 second.
- Reduces skill cooldown from 3 seconds to 0.7 seconds.
- Reduces AP consumption from 15 to 10.
- Changes damage property from neutral to fire.
- Increases base damage from 22000%/23500%(angel and demon)Matk to 26500%/28500%(angel and demon)Matk based on level 10.

* Abyss Dagger
- Increases base damage from 4600%Atk to 7350%Atk based on level 5.

* Deft Stab
- Increases base damage from 3750%Atk to 6200%Atk based on level 10.
- Increases factor weight of POW in skill formula from 5 to 7.

* From the Abyss
- Reduces skill cooldown from 60 seconds to 30 seconds.
- Increases number of hit from 2 hits to 5 hits.
- Increases base damage from 2600%Matk to 3400%Matk based on level 5.
- No longer be removed by Dispell or Clearance.
- Increases the trigger chance of abyss sphere from 15% to 25% based on level 5.

* Abyss Square
- Increases base damage from 2850+(Magic Sword Mastery skill level x 100)%Matk to 3750+(Magic Sword Mastery skill level x 200)Matk based on level 5.

* Chain Reaction Shot
- Increases base damage of secondary attack from 12350%Atk to 13550%Atk based on level 5.

* Frenzy Shot
- Increases AP recovery rate from 1 to 3.
- Increases base damage from 6150%Atk to 8250%Atk per hit based on level 10.
2024-03-11 18:58:59 +01:00
Atemo
34e90e9aa9
Rebalance Elemental Master 2024-02-05 (#8154)
* Summon Elemental Ardor
- Reduces skill cooldown from 900 seconds to 60 seconds.
- Passive mode : Flame Technique, increases damage bonus of Fire Bolt from 100% to 400%.

* Summon Elemental Diluvio
- Reduces skill cooldown from 900 seconds to 60 seconds.
- Passive mode : Cold Force, increases damage bonus of Cold Bolt from 100% to 400%.

* Summon Elemental Procella
- Reduces skill cooldown from 900 seconds to 60 seconds.
- Passive mode : Grace Breeze, increases damage bonus of Lightning Bolt from 100% to 400%.

* Summon Elemental Terremotus
- Reduces skill cooldown from 900 seconds to 60 seconds.
- Passive mode : Earth Care, increases damage bonus of Earth Spike from 80% to 800%.

* Summon Elemental Serpens
- Reduces skill cooldown from 900 seconds to 60 seconds.
- Passive mode : Deep Poisoning, increases damage bonus of Killing Cloud from 50% to 1500%.

* Conflagration
- Increases global cooldown from 0.5 seconds to 0.7 seconds.
- Increases base damage from 3750%/5750%(spirit)Matk to 6200%/7200%(spirit)Matk based on level 5.
- Reduces the chance of inflicting [blaze] on each hit from 60% to 3%.

* Diamond Storm
- Increases base damage from 8150%/14400%(spirit)Matk to 12500%/20800%(spirit)Matk based on level 5.
- Reduces the chance of inflicting [quench] on each hit from 90% to 5%.

* Lightning Land
- Increases global cooldown from 0.5 seconds to 0.7 seconds.
- Increases base damage from 3750%/5750%(spirit)Matk to 6200%/7200%(spirit)Matk based on level 5.
- Reduces the chance of inflicting [torrent] on each hit from 60% to 3%.

* Terra Drive
- Increases base damage from 8150%/14400%(spirit)Matk to 12500%/20800%(spirit)Matk based on level 5.
- Reduces the chance of inflicting [concretion] on each hit from 90% to 5%.

* Venom Swamp
- Increases global cooldown from 0.5 seconds to 0.7 seconds.
- Increases base damage from 3750%/5750%(spirit)Matk to 6200%/7200%(spirit)Matk based on level 5.
- Reduces the chance of inflicting [severe poison] on each hit from 60% to 3%.

* Elemental Buster
- Reduces AP consumption from 30 to 15.
- Reduces skill cooldown from 5 seconds to 2 seconds.
- Increases base damage from 22500%/24000%(dragon and formless)Matk to 27050%/28550%(dragon and formless)Matk based on level 10.
2024-03-11 18:58:45 +01:00
Atemo
c9582cc4fd
Rebalance Imperial Guard 2024-02-05 (#8155)
* Guardian Shield
- Reworks AP condition from recovering AP to consuming 35 AP upon using instead.
- Reduces skill duration from 60 seconds to 40 seconds.
- Increases skill cooldown from 15 seconds to 25 seconds.
- Reduces global cooldown from 1 second to 0.3 seconds.
- Reduces factor weight of MaxHP in skill formula from 50% to 30%.
- Reduces final durability factor of skill level from 250% to 125% based on level 5.

* Cross Rain
- Increases AP recovery rate from 4 to 6.
- Increases base damage from 3200+(Spear & Sword Mastery skill level x 100)%/4500+(Spear & Sword Mastery skill level x 150)%(Holy Shield)Matk to 4500+(Spear & Sword Mastery skill level x 100)%/6500+(Spear & Sword Mastery skill level x 150)%(Holy Shield)Matk per hit based on level 10.

* Holy Shield
- No longer be removed by Dispell or Clearance.

* Shield Shooting
- Increases AP recovery rate from 3 to 5.
- Increases base damage from 14900+(Shield Mastery skill level x 250)%Atk to 18500+(Shield Mastery skill level x 750)%Atk based on level 5.
- Increases factor weight of shield refine rate in skill formula from 25 to 100.
- Increases factor weight of POW in skill formula from 7 to 10.

* Overslash
- Increases AP recovery rate from 3 to 5.
- Increases base damage from 1600+(Spear & Sword Mastery skill level x 250)%Atk to 2200+(Spear & Sword Mastery skill level x 500)%Atk per hit based on level 10.

* Judgement Cross
- Changes damage property from holy to neutral.
2024-03-11 18:58:31 +01:00
Atemo
5efd5b8c95
Rebalance Hyper Novice 2024-02-05 (#8156)
* Double Bowling Bash
- Increases base damage from 3200+(Self Study Tactics skill level x 30)%Atk to 4250+(Self Study Tactics skill level x 30)%Atk per hit based on level 10.

* Shield Chain Rush
- Increases base damage from 5700+(Self Study Tactics skill level x 30)%Atk to 11350+(Self Study Tactics skill level x 30)%Atk based on level 10.

* Spiral Pierce Max
- Increases base damage from 8700+(Self Study Tactics skill level x 30)%Atk x size correction to 16000+(Self Study Tactics skill level x 30)%Atk x size correction based on level 10.

* Breaking Limit
- Increases damage bonus of Double Bowling Bash and Shield Chain Rush from 70% to 120%.

* Hell's Drive
- Increases base damage from 8500+(Self Study Sorcery skill level x 30)%Atk to 10700+(Self Study Sorcery skill level x 30)%Matk based on level 10.
2024-03-11 18:58:17 +01:00
Atemo
0865e160cb
Rebalance Night Watch 2022-12-21 (#8161)
* The Vigilante at Night
- Increases SP consumption from 65 to 88 based on level 5.
- Reduces area of effect of gatling gun from 13 x 13 cells to 11 x 11 cells based on level 5.

* Only One Bullet
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Increases base damage from 7550%/8300%Atk to 16200%/18200%Atk based on level 5.

* Spiral Shooting
- Increases base damage from 8500%/9700%Atk to 9700%/15400%Atk per hit based on level 5.

* Magazine for One
- Increases base damage from 1950%/2400%Atk to 2750%/4300%Atk per hit based on level 5.

* Wild Fire
- Increases base damage from 13250%/12500%Atk to 17500%/16500%Atk based on level 5.

* Basic Grenade
- Increases base damage from 5750%Atk to 12000%Atk based on level 5.

* Hasty Fire in the Hole
- Increases base damage from 6750%Atk to 9000%Atk per hit based on level 5.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-03-11 17:25:05 +01:00
Lemongrass3110
3b6c3b61c0
Update SU_LUNATICCARROTBEAT formula (#8152)
Taken from #7024

Co-authored-by: munkrej <schmunk@posteo.de>
2024-03-10 22:46:09 +01:00
Lemongrass3110
4124cdaa4a
Initial implementation of Night Watch (#8150)
Taken from #7024

Co-authored-by: munkrej <schmunk@posteo.de>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2024-03-10 22:10:28 +01:00
munkrej
37d9196a4e
Fixed DK_DRAGONIC_BREATH factor mix up (#8158)
Follow-up fa71d1012d
2024-03-09 15:57:08 +01:00
Atemo
f34a47ae24
Corrected a mistake in DK_SERVANTWEAPON_ATK formula. (#8157)
Follow-up fa71d1012d

Thanks to @Tolimatoi
2024-03-02 19:59:45 +01:00
Lemongrass3110
9139a21adc
Resolved a few size_t related warnings (#8085)
Disabled warnings in libconfig only for MSVS
2024-02-28 21:05:18 +01:00
inhyositsu
398bae57a8
Fixed a Zeny variable overflow in mails (#8145)
Fix the issue of Zeny variable overflow causing it to become negative.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-02-28 01:49:15 +01:00
Vincent Stumpf
d4ec7eb241
Fix inventory expansion packet versions (#8148)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-02-28 01:03:07 +01:00
Atemo
efe7824bbe
Rebalance Meister 2024-02-05 (#8137)
* Axe Stomp
- Increases global cooldown from 0.25 seconds to 0.7 seconds based on level 5.
- Increases base damage from 5150%Atk to 6200%Atk per hit based on level 5.

* Mighty Smash
- Increases global cooldown from 0.25 seconds to 0.7 seconds based on level 10.
- Increases base damage from 1825%/1850%(Axe Stomp)Atk to 2480%/2500%(Axe Stomp)Atk per hit based on level 10.

* Spark Blaster
- Increases base damage from 9250%Atk to 14600%Atk based on level 10.

* Triple Laser
- Increases base damage from 5050%Atk to 6400%Atk per hit based on level 5.

* Rush Quake
- Buff no longer be removed by Dispell or Clearance.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-02-27 23:41:43 +01:00
Atemo
fa71d1012d
Rebalance Dragon Knight 2024-02-05 (#8135)
* Servant Weapon
- Reduces skill cooldown from 150 seconds to 60 seconds based on level 5.
- Increases base damage from 2500%Atk to 4850%Atk based on level 5.
- Increases number of hit from 2 hits to 3 hits.
- No longer be removed by Dispell or Clearance.
- Increases the trigger chance of weapon from 15% to 25% based on level 5.

* Madness Crusher
- Increases base damage from 8350%Atk to 20000%Atk based on level 5.

* Storm Slash
- Increases base damage from 2200%Atk to 4050%Atk per hit based on level 5.

* Hack and Slasher
- Increases base damage from 7700%Atk to 8550%Atk per hit based on level 10.

* Dragonic Breath
- Increases factor weight of MaxHP in skill formula from 12.5% to 25%.
- Increases factor weight of MaxSP in skill formula from 25% to 50%.

Additionally:
Dragonic Breath formula updated. Thanks to @datawulf !


Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-02-27 23:41:03 +01:00
Atemo
8e44c94c7c
Rebalance Inquisitor 2024-02-05 (#8139)
* Explosion Blaster
- Increases base damage from 12000%/17600%(Oleum Sanctum)Atk to 13450%/18200%(Oleum Sanctum)Atk based on level 5.

* Third Punish
- Reduces skill cooldown from 1 second to 0.7 seconds.
- Adds global cooldown by 0.5 seconds.
- Increases base damage from 7850%Atk to 9450%Atk based on level 5.

* Third Flame Bomb
- Adds global cooldown by 0.7 seconds.
2024-02-27 21:40:43 +01:00
Atemo
9ed6ff829b
Rebalance Biolo 2024-02-05 (#8138)
Explosive Powder
- Increases base damage from 3150%/3650%(Research Report)Atk to 3750%/4250%(Research Report)Atk per hit based on level 5.
2024-02-27 21:40:03 +01:00
Atemo
e77513dc73
Rebalance Troubadour & Trouvere 2024-02-05 (#8140)
* Rhythm Shooting
- Increases base damage from 3700%/4550%(sound brand)Atk to 5300%/6100%(sound brand)Atk per hit based on level 5.

* Metallic Fury
- Increases base damage from 13000%/18000%(sound brand)Matk to 19250%/23250%(sound brand)Matk based on level 5.
- Changes sound effect.
2024-02-27 21:38:45 +01:00
Lemongrass3110
c22906d775
Created a template for packet handling (#8069) 2024-02-26 22:48:08 +01:00
Pokye
eb308dcad2
Implemented Dialog Types (#8110)
Fixes #8109

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-02-26 22:08:52 +01:00
AoShinHo
e196eadcaa
Suppressing C4018 (#8123)
* suppressing warning C4018

* dinamically get decltype suggested by vstumpf
2024-02-24 00:15:28 -08:00
BotGigo
464c122b40
Correct some conditions (#8142)
Correct comparations in conditions for some base level achievements to work with the multi level check of achievements.
2024-02-20 00:07:12 -08:00
Atemo
f9073574d3
Updated map and items up to febuary 2024 (#8136)
* Implemented equipment and etc items up to 05022024
* Added 1@vrsn map
2024-02-18 15:20:19 +01:00
Kakaroto
9305da45dc
Hateffect update (#8124)
Co-authored-by: Pokye <98105181+Pokye@users.noreply.github.com>
2024-02-17 20:17:44 +01:00
Atemo
a0bbbf1729
Rebalance Wind Hawk 20240205 (#8133)
* Gale Storm
- Reduces skill cooldown from 1.2 seconds to 0.7 seconds.
- Increases base damage from 10000%Atk to 13500%Atk based on level 5.

* Crescive Bolt
- Increases base damage from 9400%Atk to 13500%Atk based on level 10.
- Increases damage bonus on standing still from 10% per stack (up to 30% on 3 stacks) to 20% per stack (up to 60% on 3 stacks).
- Changes sound effect.

* Calamity Gale
- Reduces AP consumption from 200 to 125.
- Reduces skill cooldown from 180 seconds to 60 seconds.

* Added missing clif_skill_nodamage for WH_GALESTORM

Thanks to @Haydrich !
2024-02-17 20:14:22 +01:00
Atemo
83067220bc
Rebalance Arch Mage 20240205 (#8131)
* Climax
- Reduces AP consumption from 150 to 125.
- Reduces skill cooldown from 300 seconds to 60 seconds.

* Floral Flare Road
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Tornado Storm
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Stratum Tremor
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Rain of Crystal
- Increases global cooldown from 0.25 seconds to 0.75 seconds based on level 5.

* Crimson Arrow
- Increases base damage from 1750%/3500%Matk to 2000%/3750%Matk based on level 5.

* Storm Cannon
- Increases base damage from 6000%/7500%(Climax)Matk to 7750%/9250%(Climax)Matk based on level 5.

* Frozen Slash
- Increases base damage from 4900%/6800%(Climax)Matk to 5200%/7100%(Climax)Matk based on level 5.

* Mystery Illusion
- Increases global cooldown from 0.5 seconds to 0.75 seconds based on level 5.

* All Bloom
- Increases global cooldown from 0.5 seconds to 1 second based on level 5.

* Violent Quake
- Increases global cooldown from 0.5 seconds to 1 second based on level 5.

* Soul Vulcan Strike
- Increases base damage from 1250%Matk to 1500%Matk per hit based on level 5.

* Astral Strike
- Increases global cooldown from 0.5 seconds to 1 second based on level 10.
2024-02-17 18:35:38 +01:00
Atemo
893b133444
Rebalance Shadow Cross 20240205 (#8134)
* Savage Impact
- Increases base damage from 900%/1100%(Shadow Exceed)Atk to 1050%/1250%(Shadow Exceed)Atk per hit based on level 10.

* Shadow Stab
- Unifies number of hit from 2/3(Cloaking Exceed) hits to 3 hits regardless of Cloaking Exceed buff.
- Increases base damage from 1750%/2000%(Cloaking Exceed)Atk to 2750%/3250%(Cloaking Exceed)Atk per hit based on level 5.

* Eternal Slash
- Attack count no longer be removed by Dispell or Clearance.
- Increases base damage from 1325%/1825%(Shadow Exceed)Atk to 1500%/2100%(Shadow Exceed)Atk per hit based on level 5.
2024-02-17 14:55:47 +01:00
Atemo
8e2ee12b18
Rebalance Cardinal 20240205 (#8132)
* Framen
- Increases base damage from 4750+(Fidus Animus skill level x 25)%/5250+(Fidus Animus skill level x 25)%(demon and undead)Matk
  to
  6500+(Fidus Animus skill level x 25)%/6750+(Fidus Animus skill level x 25)%(demon and undead)Matk
  based on level 5.

* Pneumaticus Procella
- Reduces AP consumption from 30 to 20.
- Changes damage property from holy to neutral.
- Addes global cooldown by 0.5 seconds.
- Changes sound effect.
2024-02-17 14:33:59 +01:00
Atemo
c43f7b369e
Archmage skill corrections (#8120)
Corrections of several Archmage skills and High wizard skill HW_MAGICPOWER :
    AG_FROZEN_SLASH : 3 hits are displayed instead of a single hit.
    TargetType of 4th ground skills is now Ground. Ground skills don't trigger HW_SOULDRAIN. Skills affected :
        AG_VIOLENT_QUAKE_ATK
        AG_ALL_BLOOM_ATK
        AG_ALL_BLOOM_ATK2
        AG_CRYSTAL_IMPACT_ATK
        AG_ASTRAL_STRIKE_ATK
    Fixed cast time of HW_MAGICPOWER is not affected by item bonus anymore.
2024-01-31 16:13:57 +01:00
Atemo
e965e2794b
Added null pointer checks in map_delblock (#7930) 2024-01-26 15:02:51 +01:00
Atemo
04904c0947
Corrected Shrink Stuns target (#8075)
Fixed #8072

Thanks to @LadyNanuia
2024-01-26 15:00:36 +01:00
Atemo
9f90e4e9e1
Rebalance Hyper Novice 20221221 (#8111)
* Double Bowling Bash
- Reduces knock-back distance from 2 cells to 1 cell.
- Increases base damage from 2650%Atk to 3200%Atk per hit based on level 10.

* Mega Sonic Blow
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Increases base damage from 5350%Atk to 8400%Atk based on level 10.

* Shield Chain Rush
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Increases base damage from 5100%Atk to 5700%Atk based on level 10.

* Spiral Pierce Max
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Increases base damage from 4050%Atk to 8700%Atk based on level 10.

* Hell's Drive
- Increases SP consumption from 98 to 115 based on level 10.

* Ground Gravitation
- Increases SP consumption from 100 to 120 based on level 10.

* Breaking Limit
- Increases damage bonus of Mega Sonic Blow and Spiral Pierce Max from 70% to 100%.
- Increases damage bonus of Double Bowling Bash and Shield Chain Rush from 50% to 70%.
2024-01-19 14:35:17 +01:00
Ahmed Shawky
51ca9c4923
Added illusion Merchant (#7854) 2024-01-18 20:31:18 +01:00
Atemo
c8ab735348
Updated Level 250/50 to 260/55 (#8108)
Updated Level 250/50 to 260/55.
Hp and Sp are unknown.
Additionally updated Super_Novice_E job level from 50 to 70 (note: this class doesn't get additional stats by job level).
2024-01-18 15:53:29 +01:00
Lemongrass3110
72b3d1bf0e
Initial implementation of Hyper Novice (#8101)
Taken from #7024

Co-authored-by: munkrej <schmunk@posteo.de>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-01-17 21:20:20 +01:00
Lemongrass3110
d3fcb66d3a
Fixed some memleaks (#8107)
Improved memleak location reporting for parse_script
2024-01-17 18:58:13 +01:00
Atemo
f5909c3d78
Update renewal Base exp and Job exp (#8103)
* Updated Base exp
* Updated job exp
2024-01-17 14:37:05 +01:00
Atemo
5ad81d67ea
Corrected the boss spawn in lhz_dun_n (#8099)
* Removed the use of killedrid in the script in case the killer is not a player.
2024-01-16 13:56:27 +01:00
Lemongrass3110
1362c7666d
Fixed RK_WINDCUTTER not ignoring def (#8102)
The order of the checks was wrong and therefore the if could never be reached.

Co-authored-by: munkrej <schmunk@posteo.de>
2024-01-13 01:31:04 +01:00
Lemongrass3110
c4026c08c8
Some bonus ignored left_cardfix_to_right (#8097)
Taken from #7024

Co-authored-by: munkrej <schmunk@posteo.de>
2024-01-12 11:42:08 +01:00
Atemo
360b8bc3e2
Corrected IG_GRAND_JUDGEMENT (#8095)
* Moved IG_GRAND_JUDGEMENT with other splash skills in skill_castend_damage_id

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Fixed #8080

Thanks to @Jaikayray
2024-01-11 15:31:17 +01:00
Lemongrass3110
96f40d9adc Converted some whitespaces to tabs 2024-01-11 00:47:57 +01:00
Atemo
a29e115a62
Corrected CD_ARBITRIUM_ATK area of damage (#8096)
* The splash area should be 9x9 according to skill description

Fixed #8079
Thanks to @Jaikayray
2024-01-10 23:57:51 +01:00
munkrej
60dbe5a42d
Cleanup of PATK calculation (#8094)
Follow up to 66dddb3 (rathena/rathena#7996)

Fixes RK_DRAGONBREATH handling when DK_DRAGONIC_AURA is not skilled
2024-01-08 21:10:11 +01:00
Atemo
a3cb48a341
Item DB correction/update (#8091)
* Corrected item Locations
* Added missing effect when autobonus is triggered for some snow and glacier enchants
* Updated item Trade
2024-01-08 20:24:23 +01:00
Atemo
1f3b42c175
Updated hidden garden instance (#8092)
* Monsters spawn times is significantly reduced.
2024-01-08 19:46:15 +01:00
Atemo
360710d2f0
Rebalance Abyss chaser 20221221 (#8081)
* Abyss Dagger
- Increases cooldown from 0.3 seconds to 0.4 seconds.
- Increases SP consumption from 64 to 76 based on level 5.
- Increases base damage from 2600%Atk to 4600%Atk based on level 5.

* Frenzy Shot
- Increases cooldown from 0.2 seconds to 0.35 seconds.
- Increases SP consumption from 55 to 65 based on level 10.
- Increases number of hit from 1 hit to 2 hits.
- Increases base damage from 4000%Atk to 6150%Atk based on level 10.
- Increases factor weight of CON in skill formula from 5 to 15.

* Deft Stab
- Removes a chance to trigger the skill one more time.
- Increases SP consumption from 62 to 72 based on level 10.
- Increases cooldown from 0.3 seconds to 0.7 seconds.
- Reduces base damage from 5850%Atk to 3750%Atk based on level 10.
- Changes damage logic from 5 split hits to 5 cumulative hits.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-01-06 19:58:18 +01:00
Lemongrass3110
644a22c5bb
Fixed convex mirror (#8084)
When the "NoSave" of SC_BOSSMAPINFO is removed, this could lead to issues after a character logs back in.

Fixes #8083

Thanks to @Gyakushinn
2024-01-05 21:50:59 +01:00
Atemo
ff90feaf85
Rebalance Meister 20221221 (#8076)
Axe Stomp
- Increases SP consumption from 74 to 85 based on level 5.
- Increases base damage from 4600%Atk to 5150%Atk per hit based on level 5.

Mighty Smash, Spark Blaster  and Triple Laser are already up-to-date
2024-01-02 20:39:49 +01:00
Atemo
2121aa2ed7
Rebalance Dragon Knight 20221221 (#8077)
* Madness Crusher
- Reduces SP consumption from 68 to 55 based on level 5.
- Increases base damage from 4400%Atk to 8350%Atk based on level 5.
- Increases factor weight of POW in skill formula from 7 to 10.

* Storm Slash
- Increases cooldown from 0.3 seconds to 0.35 seconds.
- Reduces SP consumption from 60 to 55 based on level 5.
- Increases base damage from 950%Atk to 2200%Atk per hit based on level 5.
- Increases the chance to double skill damage while under Giant Growth buff from 30% to 60%.

* Hack and Slasher
- Increases base damage from 7300%Atk to 7700%Atk per hit based on level 10.
- Reduces area of effect from 9 x 9 cells to 7 x 7 cells based on level 10.
- Applies critical damage, the critical chance is the user's Cri.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-01-02 19:07:54 +01:00
Atemo
091a6c5401
Rebalance Troubadour & Trouvere 20221221 (#8068)
* Rhythm Shooting
- Increases cooldown from 0.15 seconds to 0.35 seconds.
- Increases base damage from 800%/1400%Atk to 3700%/4550%Atk per hit based on level 5.
- Increases factor weight of CON in skill formula from 3 to 5 (7 on targets marked with sound brand).

Additionally
- The effect from Rhythm Shooting does not remove SC_SOUNDBLEND anymore (written in the skill description)

* Metallic Fury
- Reworks skill to dealing damage to surrounding enemies around the target (9 x 9 cells based on level 5).
- Increases cooldown from 0.3 seconds to 0.4 seconds.
- Increases global cool time from 0.3 seconds to 0.5 seconds.
- No longer remove sound brand debuff from target. (doesn't mention it changelog but it works)
- Increases base damage from 11000%Matk to 13000%/18000%(targets marked with sound brand)Matk based on level 5.
- Increases factor weight of SPL in skill formula (on targets marked with sound brand) from 1.5x of Stage Manner skill level to 2x of Stage Manner skill level.
2024-01-02 18:09:03 +01:00
Atemo
f22e423677
Rebalance Imperial Guard 20221221 (#8078)
* Cross Rain
- Reduces cooldown from 4.5 seconds to 2.4 seconds.
- Reduces skill duration from 4.5 seconds to 2.4 seconds based on level 10.
- Increases factor weight of Spear & Sword Mastery skill level in skill formula from 50/100 (Holy Shield) to 100/150 (Holy Shield) based on level 10.
- Increases factor weight of SPL in skill formula from 5 to 7.
- Reduces AP recovery rate from 7 to 4.

* Shield Shooting
- Reworks skill to dealing damage to surrounding enemies within 7 x 7 cells around the target.
- Reduces cast range from 11 cells to 9 cells.
- Increases factor weight of Shield Mastery skill level in skill formula from 75 to 250 based on level 5.
- Increases base damage from 11900%Atk to 14900%Atk based on level 5.
- Increases factor weight of POW in skill formula from 5 to 7.
- Increases factor weight of shield refine rate in skill formula from 4 to 25.
2024-01-02 14:32:39 +01:00
Vincent Stumpf
1c31d9c83e
Make the global packet_buffer owned by common (#8073) 2024-01-01 19:05:21 +01:00
Vincent Stumpf
3756872529
Fix token auth packet handling (#8071)
It should skip the entire packet
2023-12-30 18:26:53 -08:00
Lemongrass3110
fe9c959bf0
Removed flag parameter for MC_IDENTIFY (#8070)
Fixes #7634

Thanks to @OptimusM and @laziem
2023-12-30 19:07:38 +01:00
Atemo
756abe34d5
Rebalance Arch mage 20221221 (#8065)
* Rain of Crystal
- Reduces area of effect from 19 x 19 cells to 13 x 13 cells based on level 5.
- Increases SP consumption from 100 to 125 based on level 5.

* Crimson Arrow
- Reduces SP consumption from 94 to 90 based on level 5.
- Increases base damage of linear damage from 1500%Matk to 1750%Matk based on level 5.
- Increases base damage of explosion damage from 3000%Matk to 3500%Matk based on level 5.

* Storm Cannon
- Reduces SP consumption from 94 to 88 based on level 5.
- Increases base damage from 4750%/6250%Matk to 6000%/7500%Matk based on level 5.

* Rock Down
- Reduces SP consumption from 94 to 88 based on level 5.
- Increases base damage from 4750%/6250%Matk to 6000%/7500%Matk based on level 5.

* Frozen Slash
- Increases SP consumption from 96 to 115 based on level 5.
- Increases base damage from 4750%/6650%Matk to 4900%/6800%Matk based on level 5.

* Destructive Hurricane
- Increases cooldown from 2 seconds to 2.5 seconds.
- Increases base damage from 14250%Matk to 14850%Matk based on level 5.
- Reduces damage bonus from Climax level 3 from 200% to 150%.
- Changes damage modifier from Climax level 5 from 50% increasing to 20% reducing.
- Increases SP consumption from 132 to 186 based on level 5.

* Crystal Impact
- Reduces area of effect from 15 x 15 cells to 13 x 13 cells based on level 5.
- Increases SP consumption from 132 to 186 based on level 5.
- Reduces area of effect bonus from Climax level 5 from entire screen to 15 x 15 cells.


Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-12-30 14:52:34 +01:00
Atemo
23766e61c3
Rebalance Windhawk 20221221 (#8020)
* No Limits (Ranger)
- No longer be removed by Dispell or Clearance.

* Calamity Gale
- Increases duration from 60 seconds to 180 seconds.
- Reduces cooldown from 300 seconds to 180 seconds.

Note: it was not implemented
- No longer be removed when using No Limits.

* Gale Storm
- Reduces cooldown from 1.5 seconds to 1.2 seconds.
- Increases SP consumption from 100 to 120 based on level 10.
- Increases base damage from 9500%Atk to 10000%Atk based on level 5.
- Reduces area of effect from 11 x 11 cells to 9 x 9 cells based on level 10.

Note: CON weight was already 10
- Increases factor weight of CON in skill formula from 5 to 10.

* Crescive Bolt
- Increases cooldown from 0.15 seconds to 0.35 seconds.
- Increases global cool time from 0.3 seconds to 0.7 seconds.
- Increases base damage from 3400%Atk to 9400%Atk based on level 10.

Additionnally
- Removed leftover Deep Blind Trap / Solid Trap / Swift Trap / Flame Trap status ailments in `skills_db.yml` (from previous rebalance)
- Corrected WH HAWK BOOMERANG and WH_HAWKBOOMERANG formula according to the Korean description of the skill.
- Included WH_NATUREFRIENDLY in the damage formula of WH_HAWKRUSH and WH_HAWKBOOMERANG (x1.5 at level 5) (source: tests on KRO)

Thanks to @datawulf
2023-12-29 23:57:52 +01:00
Atemo
11e50dec41
Rebalance cardinal 20221221 (#8021)
* Framen
- Increases base damage from 4000%/4500%Matk to 4750%/5250%Matk based on level 5.

* Arbitrium
- Reduces cooldown from 1.5 seconds to 1 second.
- Increases SP consumption from 112 to 125 based on level 10.
- Applies AP recovery rate by 2.
- Increases base damage of area damage from 12500%Matk to 17500%Matk based on level 10.
- Increases factor weight of Fidus Animus skill level in skill formula of area damage from 100 to 500 based on level 10.
- Increases factor weight of SPL in skill formula from 7 to 10.

* Petitio
- Reduces area of effect from 9 x 9 cells to 7 x 7 cells based on level 10.
- Increases factor weight of Mace & Book Mastery skill level in skill formula from 100 to 500 based on level 10.
2023-12-29 22:54:14 +01:00
Lemongrass3110
7999ccb215
Refactored login-server clif to structs (#8058)
Communication between the login-server and the client is now done with structs.
Moved the definition of the global reusable packet buffer to socket.hpp
2023-12-29 22:04:42 +01:00
Atemo
0fe2d0a0fe
Rebalance inquisitor 20221221 (#8022)
* Oleum Sanctum
- Reduces cooldown from 2 seconds to 1.5 seconds.
- No longer require Holy Water on casting.
- Reduces area of effect from 11 x 11 cells to 9 x 9 cells based on level 5.

* Explosion Blaster
- Adds global cool time by 1 second.
- Increases SP consumption from 90 to 125 based on level 5.
- Reduces area of effect from 11 x 11 cells to 9 x 9 cells based on level 5.
- Reduces base damage of from 14000%Atk to 12000%Atk based on level 5.
- Increases base damage against Oleum Sanctum debuff from 16000%Atk to 17600%Atk based on level 5.
- Reduces factor weight of POW in skill formula (without Oleum Sanctum debuff) from 15 to 10.

* Massive Flame Blaster
- Adds global cool time by 0.5 seconds.
- Reduces area of effect from 11 x 11 cells to 9 x 9 cells.
- Increases base damage from 21500%/23000%Atk to 23000%/24500%Atk based on level 10.
2023-12-29 20:22:44 +01:00
Atemo
ccce839881
Rebalance shadow cross 20221221 (#8019)
* Savage Impact
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases area of effect from 5 x 5 cells to 7 x 7 cells based on level 10.
- Applies AP recovery rate by 2.

* Shadow Stab
- The skill will deal damage for 2 hits.
- While under Cloaking Exceed buff, increases number of hit to 3 hits with higher damage per hit.
- Increases factor weight of POW in skill formula while under Cloaking Exceed buff from 5 to 7.
- Increases base damage from 1500%Atk to 1750%/2000%Atk per hit based on level 5.
2023-12-29 16:51:43 +01:00
Sola丶小克
b0971c0f67
Refactor some MySQL connection variables (#8059) 2023-12-29 15:37:01 +01:00
Lemongrass3110
9c06340f3a Fixed a warning related to [[fallthrough]]
Follow up to 61c2480

Thanks to @Pokye
2023-12-29 11:49:41 +01:00
Lemongrass3110
afbfd13606
Prevent clients to use server accounts (#8063)
Fixes #7772

Thanks to @Litro
2023-12-29 11:15:41 +01:00
Lemongrass3110
e4ec88c666
Added support for CZ_RESET_SKILL (#8062)
Fixes #7961
Added a dummy implementation to prevent players from disconnecting, until we know what that command should do.

Thanks to @jamesandrewww
2023-12-29 10:40:55 +01:00
Singe Horizontal
782299112b
Restores stat points override when loading db (#8061)
Fixes #8060
2023-12-29 01:34:19 +01:00
Vincent Stumpf
61c2480d89
Add explicit [[fallthrough]] attributes (#8054)
Fixes #7918
2023-12-29 01:08:24 +01:00
Lemongrass3110
b6f17692e9
Updated Hercules packets (#8056) 2023-12-29 00:20:09 +01:00
Lemongrass3110
e3a3bfc868
Fixed login_check_password (#8052)
Fixes #8043

Thanks to @LasherasGH
2023-12-28 23:56:23 +01:00
Atemo
79ea192032
Updated item DB up to december 19 2023 (#8057)
* Updated item DB up to december 19 2023
* Corrections in combo DB
* Removed duplicated combos
2023-12-28 14:32:48 +01:00
Vincent Stumpf
8336f046b7
Allow default sell values in npc shop scripts (#8050)
Fixes #6594
2023-12-27 22:16:04 +01:00
Sola丶小克
1f6ec24a33
Remove deprecated global sql settings code (#8055) 2023-12-27 17:31:04 +01:00
Vincent Stumpf
f2a3bad3e2
Cleanup uses of SWAP macro (#8051) 2023-12-27 11:36:46 +01:00
Lemongrass3110
82b36dc847
Fixed some compiler warnings (#8053)
Fixes #8044

Thanks to @Pokye
2023-12-27 10:58:14 +01:00
Lemongrass3110
cd0c44af60
Refactored script command rand (#8040)
Fixes #8041

Added support for int64, so the range of the random numbers that can be generated is much wider now.

Changed the logic to be more restrictive:
	(1) The range version is intended for positive numbers only.
	(2) If minimum and maximum are equal and no random value can be calculated.
Triggering the more restrictive behavior will trigger the script source (file) to be reported in the map-server.

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2023-12-26 23:52:37 +01:00
Lemongrass3110
871c4e62cf Reverted variable rename
Follow up to 6750837
2023-12-26 22:04:38 +01:00
Vincent Stumpf
6750837854
Let rnd_value callers not care about order (#8046) 2023-12-24 15:42:02 -08:00
Lemongrass3110
ac85d44197
Refactored CZ_REQ_MERGE_ITEM (#8039)
Thanks to @secretdataz!
2023-12-20 13:39:11 +01:00
Lemongrass3110
c33bb0b726
Fixed NPC_EARTHQUAKE usages (#8038)
Fixes #8036

Thanks to @asydia
2023-12-20 00:41:57 +01:00
Lemon
7c153416bc
Improved randomness (part 1) (#7882)
Faster and with no module bias

Removed rnd_init, rnd_uint32 and rnd_uniform
From now on we will only use rnd_value(min, max) for values in range [min, max] and rnd_chance(chance, base) for chances

Fixes #7881
Fixes #7883
Fixes #7884
Fixes #7885

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-12-20 00:12:15 +01:00
idk-whoami
ad3a2e99eb
Follow up to c898007 (#8035)
Location correction of C_Imperial_Feather ID 5911

Thanks to @Pokye
2023-12-19 20:57:58 +01:00
Lemongrass3110
e0cf16d3e9
Fixed pc_isequip calls (#8037)
Fixes #8034

Thanks to @alisonrag
2023-12-19 20:22:48 +01:00
idk-whoami
c8980072a5
Corrected script for some item #26 (#8026)
Thanks to @Pokye, @Atemo
2023-12-15 15:59:55 +01:00
HAO YAN
7ee7a25887
Add autoloot script command (#8032) 2023-12-14 15:39:57 +01:00
AshiHanna
a7f0aab600
Add the stockall command (#8008)
* The command will transfer all items from the cart to the inventory based on the item type.
2023-12-12 08:12:06 -05:00
Singe Horizontal
53f1c5bb80
Default multi-processor compilation on VS (#8029) 2023-12-11 21:30:48 +01:00
HAO YAN
7db67c6207
Battleground and clan support for addrid (#7969) 2023-12-11 08:47:00 +01:00
HAO YAN
461294f423
Add channel_join script command (#7970) 2023-12-11 08:43:56 +01:00
Singe Horizontal
eec798bfc3
Restores a correct option index (#8031)
Fixes #8024 and #7956.
Fixes an issue with guild storage and retrieving guild bound items.
2023-12-10 00:28:00 -05:00
Atemo
bfae557aeb
Updated illusion of moonlight (#8025)
* Eliminating 10 Deranged Adventurer (~amount) will now spawn the Wizard of Truth monster in the location of the last monster killed.

Fixed #7698
2023-12-01 15:12:02 +01:00
Atemo
5a92ebd98a
Updated Old glast heim instance (#8016)
* Added the ability to skip part of the scenario (fast mode)

Thanks to @idk-whoami for testing
2023-11-30 18:35:46 +01:00
Atemo
8aa2430950
Updated item DB and mapcache up to november 15 2023 (#8015)
* Updated mapcache
* Removed duplicate and sort corrections in item DB/combo DB
* Updated item_enchant.yml
* Corrected Ramor Manteau according to lua
2023-11-30 18:23:26 +01:00
Atemo
8efb5b9d71
Updated Illusion dungeon exchange NPCs (#8014) 2023-11-30 18:22:17 +01:00
eppc0330
d8d7955702
Implement NPC_WIDECRITICALWOUND (#7977) 2023-11-25 22:47:27 +01:00
Atemo
8740574ae3
Updated item DB and mapcache up to november 1 2023 (#8012) 2023-11-18 00:15:59 +01:00
Atemo
8102f5eaad
Updated SC_*_LIFEPOTION and SC_S_MANAPOTION (#8011)
* Removed the heal effect from SC_*_LIFEPOTION and SC_S_MANAPOTION like on official servers.
2023-11-14 13:53:34 +01:00
Atemo
c23afaeac0
Implemented script command opentips (#8005)
- Opens the tip box UI for the attached player or the given character ID.
2023-11-13 19:15:40 +01:00
Sapito Sucio
8be1f819d9
General typos (#8000)
* Fixes typos in several NPC.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-11-10 12:51:01 -05:00
HAO YAN
a1616903a6
Add has_autoloot script command (#7972)
* Adds the has_autoloot script command to check if a player is autolooting items.
2023-11-06 12:30:34 -05:00
Aleos
2cfafe4c9f
Resolves players escaping jail early (#7781)
* Fixes #7771.
* Adds a missing check to avoid warping players who are actively jailed out early after relogging.
Thanks to @fab10Carvalho and @Lemongrass3110!
2023-11-06 10:26:02 -05:00
munkrej
66dddb3b19
Fixes RK_DRAGONBREATH/RK_DRAGONBREATH_WATER scaling with 4th job (#7996)
Corrected POW scaling
Corrected P.ATK scaling
Corrected skills scaling with Dragonic Aura buff
2023-11-03 14:07:28 +01:00
idk-whoami
a8b7f929f6
Fixed an issue in eden market (#8002) 2023-11-03 14:03:28 +01:00
Vincent Stumpf
02cd29c57b
Set mob's jname to name if not specified (#8003)
Fixes #8001
2023-11-03 08:25:35 -04:00
idk-whoami
676c2483ac
Script correction of Record of Mage (ID 490288) (#7997) 2023-11-01 17:21:10 +01:00
Atemo
ebabfd8807
Implemented DK_DRAGONIC_BREATH (#7985)
Deals normal long ranged physical damage to the target.
    Can only be used when riding dragon.
    Deals additional damage depends on user's MaxHP and MaxSP.
    Affected by Hit/Flee calculation.
    Ignores physical defense.
    Damage property depends on weapon property.
    Affected by attack modifiers (such as race modifier).
    Recovers 2 AP.
    When using while under Dragonic Aura buff, increases influence of MaxHP and MaxSP in skill damage.
    Fixed casting time : 0.5 seconds (based on level 10).
    Variable Casting time : 2 seconds (based on level 10).
    Cooldown: 0.5 seconds (based on level 10).
    Global cool time : 0.15 seconds (based on level 10).

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Credit to @datawulf
2023-11-01 15:47:54 +01:00
Atemo
da9e321330
Implemented new Biolo skills (#7987)
* Implemented BO_EXPLOSIVE_POWDER
- Deals melee physical damage to all targets around the user.
- Doesn't need any catalyst.
- When using while under Research Report buff, increases damage and number of hit.
- Recovers 2 AP.
- Fixed casting time : - (based on level 5).
- Variable Casting time : - (based on level 5).
- Cooldown: 0.7 seconds (based on level 5).
- Global cool time : 0.25 seconds (based on level 5).

* Implemented BO_MAYHEMIC_THORNS
- Deals long ranged physical damage to the target and surrounding enemies around the target with the range up to 9x9 cells.
- Doesn't need any catalyst.
- Has a chance to trigger critical, the critical chance is the user's cri.
- When using while under Research Report buff, increases damage and number of hit.
- Recovers 2 AP.
- Fixed casting time : 0.5 seconds (based on level 10).
- Variable Casting time : 1 second (based on level 10).
- Cooldown: 0.7 seconds (based on level 10).
- Global cool time : 0.15 seconds (based on level 10).

* Skills updated to 2nd rebalance

Credit to @datawulf
2023-10-30 22:07:29 +01:00
Atemo
eec9d34ead
Implemented new Meister skills (#7986)
* Implemented MT_MIGHTY_SMASH
- Deals melee physical damage to all targets around the user.
- When using while under Axe Stomp buff, increases damage and number of hit.
- Fixed casting time : - (based on level 10).
- Variable Casting time : - (based on level 10).
- Cooldown: 0.3 seconds (based on level 10).
- Global cool time : - (based on level 10).

* Updated Mighty Smash to last rebalance
- Increases cooldown from 0.3 seconds to 0.5 seconds.
- Adds global cool time by 0.25 seconds.
- Increases SP consumption from 78 to 95 based on level 10.
- Reduces base damage from 3100%/3150%Atk to 1825%/1850%Atk per hit based on level 10.
- Increases number of hit from 3/5 hits to 5/7 hits.
- While under Axe Stomp buff, increases factor weight of POW in skill formula from 7 to 10.

* Implemented MT_TRIPLE_LASER
- Deals long ranged physical damage to the target.
- Can only be used when using Madogear.
- Has a chance to trigger critical, the critical chance is the user's cri.
- Damage property depends on weapon property.
- Doesn't consume magic gear fuel or cannonball.
- Fixed casting time : 0.5 seconds (based on level 5).
- Variable Casting time : 1 seconds (based on level 5).
- Cooldown: 0.25 seconds (based on level 5).
- Global cool time : - (based on level 5).

* Updated Triple Laser to last rebalance
- Increases cooldown from 0.25 seconds to 0.35 seconds.
- Adds global cool time by 0.25 seconds.
- Increases base damage from 3300%Atk to 5050%Atk per hit based on level 5.
- Increases factor weight of POW in skill formula from 10 to 12.

* Implemented MT_SPARK_BLASTER
- Deals long ranged physical damage to the target and surrounding enemies around the target with the range up to 9x9 cells.
- Can only be used when using Madogear.
- Affected by Hit/Flee calculation.
- Ignores physical defense.
- Doesn't consume magic gear fuel or cannonball.
- Damage property depends on weapon property.
- Recovers 2 AP.
- Fixed casting time : 0.5 seconds (based on level 10).
- Variable Casting time : 1.5 seconds (based on level 10).
- Cooldown: 0.7 seconds (based on level 10).
- Global cool time : 0.25 seconds (based on level 10).

* Updated Spark Blaster to last rebalance
- Reduces cooldown from 0.7 seconds to 0.5 seconds.
- Increases base damage from 7750%Atk to 9250%Atk based on level 10.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Credits to @datawulf
2023-10-30 16:34:52 +01:00
Sapito Sucio
f000e76ba4
Fixed some typos in several city scripts (#7995)
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
2023-10-30 09:43:27 +01:00
Sapito Sucio
f48823fe73
Fixed some typos in Gungslinger, Ninja, Taekwon and Dandelion quests (#7993)
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
2023-10-30 08:35:26 +01:00
Sapito Sucio
8459fc8dbb
Fixed some typos in Rogue's Job script (#7991) 2023-10-30 08:27:44 +01:00
Aleos
3e3a716468
Fix pre-re Mercenary skills (#7981) 2023-10-26 19:49:30 -04:00
Aleos
b794224b18
Corrects duplicate NPC name in Moscovia Inn (#7983)
* Fixes #7979.
* Removes a duplicate NPC name title for the Moscovia Inn script.
Thanks to @Daraen1!
2023-10-25 14:11:42 -04:00
Aleos
2487d2bf79
Implement s_mob_db constructor (#7799)
* Follow up to 65200eb.
* Removes a lot of else cases when parsing monster data.
* Fixes an issue where the damagetaken value of monsters would be reset after issuing a mob_spawn().
Thanks to @Lemongrass3110, @mplaten, and @vstumpf!
2023-10-25 08:58:04 -04:00
Danilo Lemes
ba1ed0f6ee
Update docs from txt to Markdown (#7975)
* Update and rename packet_struct_notation.txt to packet_struct_notation.md
* Update and rename achievements.txt to achievements.md
* Update and rename effect_list.txt to effect_list.md

---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-10-20 11:00:52 -04:00
Atemo
1e4475b438
Updated item_group_db.yml (#6543)
Boxes updated :
* Updated item scripts
* Item scripts converted to item group
2023-10-18 21:32:30 +02:00
Pokye
62a49a2d5a
Update Effect List (#7960)
* Adds effect constant names to the list.
2023-10-18 09:24:34 -04:00
idk-whoami
1d5fdbad80
Script correction of Jeje Cap (ID 19453) (#7967) 2023-10-15 17:11:03 +02:00
Atemo
6c5be5b7df
Updated Item Trade (#7964) 2023-10-11 14:54:02 +02:00
Atemo
b4e066a37f
Extended item_group_db.yml (#6173)
* Added Index field
  The structure now allows to define the same item with different data
* Updated the tool yamlupgrade for version upgrade
2023-10-10 17:21:09 +02:00
idk-whoami
61311f5912
Corrected script for some item #25 (#7946) 2023-10-10 13:47:08 +02:00
Harvin
4547dc8e6a
Fix and update guild storage item bound retrieve (#7956) 2023-10-08 22:38:33 +02:00
Harvin
0e9ae33f64
Fix mailing special card (#7950)
Fixes #7947

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-10-05 09:12:09 +02:00
Lemongrass3110
7977612e0b
Refactored SC_LERADSDEW (#7958)
Now it also makes use of the Fail configuration in YAML
2023-10-05 08:26:05 +02:00
Aleos
bbb6a9e90c
Fixes Spiderweb SCS_NOMOVECOND (#7953)
* Fixes #7948.
* Removes Spiderweb from the SCS_NOMOVECOND checks.
* Follow up to f28d207.
Thanks to @izecold!
2023-10-04 19:15:11 -04:00
Lemongrass3110
f5889b08ea
Implemented the new unequip all button (#7955)
With this button you can also unequip all costumes now.
Also the button will now unequip your arrows.

Thanks to @Dia and @Pokye
2023-10-05 01:12:49 +02:00
eppc0330
5b2f4e63a7
Fix temp skill not removed (#7939)
Fixes #5382
2023-10-03 16:18:02 +02:00
eppc0330
a7f05bf696
Fixed marketshop not sending empty stocks (#7932)
Fix sold out item removed on sale list of marketshop.
Now the item icon still exist in marketshop as gray icon.

Fixes #7931
2023-10-02 23:39:29 +02:00
Atemo
8b6c072ff5
Enabled some missing NPCs on memorial initialization (#7945)
Thanks to @Dieby
2023-09-26 16:04:59 +02:00
mazvi
00a9077dd6
Corrected Lich_Lord_Card item script (#7943) 2023-09-26 15:36:29 +02:00
Atemo
73604e370f
Updated item DB and mapcache up to september 2023 (#7940)
* Added new items
* Item scripts corrections
* Updated item prices
* Updated mapcache
* Corrected Royal Guardian Ring and Lich Lord Card Position

Thanks to @mazvi
2023-09-24 14:25:47 +02:00
Lemon
1bc9748755
Fixes crit calculation on pre-renewal (#7938) 2023-09-21 16:04:15 +02:00
mazvi
dd2c582179
Update upgrade_20230913.sql (#7935)
Resolve Issue: SQL 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 2
2023-09-19 08:42:05 +02:00
Kanin Temsrisuk
fffad65480
Corrections in Item DB. (#7928)
* Fixed wrong item bonus (Item Drop)
* Removed duplicate id
* Fixed wrong item bonus (Race)
* Fixed item type
2023-09-15 22:40:34 +02:00
Atemo
8196149b2b
Additional check in script_instancegetid (#7929) 2023-09-15 17:36:50 +02:00
elanosilveira
10c78203ba
Fixes missing else case in pre-re Archer quest (#7856)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
2023-09-15 13:52:10 +02:00
eppc0330
a7ea96afa9
Item DB corrections (#7919)
* Implemented status change SC_G_LIFEPOTION 
* Corrected status change SC_ALMIGHTY
2023-09-14 22:49:11 +02:00
Aleos
442cf87fcc
Fixes monster escape AI issues (#7927)
* Fixes #7904 and fixes #7916.
* Resolves NPC_RUN and NPC_RANDOMMOVE monsters not always reaching their intended escape distance.
* Resolves Marine Sphere calling the run skill too early resulting in the distance escaped not always being the same.
* Resolves Wink of Charm not forcing the target to fail skill use on the caster.
* Renames the monster alchemist state to can_escape to fit multiple uses.
Thanks to @Leemonn and @Lemongrass3110!
2023-09-14 12:41:47 -04:00
Aleos
6e0a5bfa83
Adds missing mob SQL column for Illusion Turtle (#7926)
* Fixes #7925.
* Follow up to 0f18869.
Thanks to @SpineOfSteel and @Atemo!
Co-authored-by: Atemo <capucrath@gmail.com>
2023-09-13 08:50:30 -04:00
eppc0330
6fb5120b8c
Fix RG_PLAGIARISM aspd bonus (#7922)
* Fixes #7921.
2023-09-08 10:41:21 -04:00
eppc0330
c600d817ba
SR_TIGERCANNON behavior fix (#7895)
* Fixes #7894.
2023-09-08 08:56:51 -04:00
Atemo
cdf377e071
Added Mysterious Cookie Shop NPC (#7915)
* NPC who opens several barter shops. Each shop exchange mileage coupons (obtainable via events, cash shop) to etc costume stones (used to enchant costumes) or costumes.

Thanks to @Lemongrass3110 !
2023-09-07 15:11:20 +02:00
Aleos
f4fa967991
Adds buy/sell safety check for Market Shops (#7840)
* Fixes #7191.
* Adds a buy and sell safety check from the Market Shop type.
* Also includes an item validation check when loading items from SQL for Market Shops.
Thanks to @mazvi!
2023-09-05 13:34:40 -04:00
idk-whoami
0f18869276
Corrected script for some item #24 (#7914)
Thanks to @Atemo
2023-09-01 17:13:05 +02:00
Atemo
ffd940b2b5
Updated item DB up to august 30 2023 (#7913) 2023-08-31 00:18:28 +02:00
Atemo
149439a25d
Item Database corrections (#7912)
* Replace grade values by constants
* Corrections and update of the item database according to EquipmentProperties.lub from the client
2023-08-30 20:12:27 +02:00
Atemo
673ef066fb
Uncommented Illusion investigation - Illusion of twins quest (#7911) 2023-08-29 15:56:58 +02:00
Atemo
b37107853a
Some correction in Illusion investigation NPCs (#7855)
* Some correction in Illusion investigation NPCs
* After discussion, 9ddd26f1e2 reverted to not using same NPC name as Kiel quest
* Corrections of the questinfo QTYPE

Thanks to @crazy-arashi, @Pokye
2023-08-29 14:52:28 +02:00
mazvi
3cf70659fa
Updated illusion_investigation.txt (#7908)
Enabled Illusion Investigation: Illusion of Twins
2023-08-28 16:31:12 +02:00
inhyositsu
209de449c9
Don’t exit the process during a crash (#7902)
* Do not exit the process while receiving crash signal so that the system will make core dump correctly.
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-08-27 19:14:06 -04:00
Atemo
eadfa053f6
Rebalance Troubadour & Trouvere 20220608 (3rd) (#7898)
* Sound Blend
- Reduces SP consumption from 128 to 80 based on level 5.

* Metallic Fury
- Reduces cooldown from 0.5 seconds to 0.3 seconds.
- Reduces SP consumption from 168 to 94 based on level 5.
- Reduces AP recovery rate from 3 to 2 based on level 5.
- Increases damage from 4500%/4950~6750%(area damage according to number of branded target)Matk to 11000%/12500~18500%(area damage according to number of branded target)Matk based on level 5.

* Rhythm Shooting
- Adds 0.15 seconds cooldown.
- Removes 0.15 seconds delay after skill.
- Reduces SP consumption from 90 to 52 based on level 5.
- Increases damage from 600%/780%(branded target)Atk to 800%/1400%(branded target)Atk based on level 5.
- Increases factor weight of CON in skill formula from 2 to 3.

* Rose Blossom
- Reduces variable casting time from 2 seconds to 1 second.
- Increases cooldown from 0.5 seconds to 0.7 seconds.
- Reduces SP consumption from 125 to 94 based on level 5.
- Increases damage from 3750%/1750%(area damage)Atk to 11200%/15250%(area damage)Atk based on level 5.
- Increases factor weight of CON in skill formula from 3/2(area damage) to 3/3(area damage).

Checked against https://github.com/rathena/rathena/pull/7024
Credit to @datawulf for Metallic Fury update
2023-08-16 22:21:26 +02:00
idk-whoami
6611aa731c
Corrected script for some item #23 (#7860) 2023-08-16 21:02:37 +02:00
elanosilveira
379009b31f
Small changes in spelling and removed duplicated warp portal. (#7873)
The first course of the test had two warp ports very close to each other warping to the same place for no reason.
2023-08-13 14:29:10 +02:00
elanosilveira
a1db6278ac
Quest Merchant with repeated serial number in string. (#7868) 2023-08-13 13:52:48 +02:00
Kanin Temsrisuk
4268dd025b
Fix Giant Fly Wing bugs (#7887) 2023-08-13 13:45:59 +02:00
Atemo
d53880cf1e
Rebalance imperial guard 20220608 (#7893)
* Overslash
- Reduces cooldown from 1 second to 0.7 seconds.
- Reduces SP consumption from 68 to 65 based on level 5.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 1800%Atk to 2200%Atk per hit based on level 10 (Spear & Sword Mastery level 10).

Already implemented
- Increases factor weight of POW in skill formula from 2 to 5.

* Shield Shooting
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 6440%Atk to 14440%Atk based on level 5 (Shield Mastery level 10, shield refine rate is 10 and shield weight is 150).

Already implemented
- Increases factor weight of POW in skill formula from 3 to 5.

Notes
- Factor weight of shield refine rate is taken from next rebalance: "Increases factor weight of shield refine rate in skill formula from 4 to 25."
- Factor weight of the shield weight is deduced from the skill base damage: 11900%Atk on level 5.

* Cross Rain
- Reduces cooldown from 5 seconds to 4.5 seconds.
- Reduces delay after skill from 0.5 seconds to 0.15 seconds.
- Increases SP consumption from 68 to 78 based on level 10.
- Increases AP recovery rate from 5 to 7.
- Increases damage from 2000%/3500%(Holy Shield)Matk to 3700%/5500%(Holy Shield)Matk per hit based on level 10 (Spear & Sword Mastery level 10).

* Grand Judgement
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 0.5 seconds delay after skill.
- Increases SP consumption from 68 to 78 based on level 10.
- Reduces AP consumption from 150 to 15.
- Reduces duration of Grand Judgement buff from 300 seconds to 150 seconds.
- Increases damage from 7500%/11000%(plant and insect race)Atk to 15250%/16850%(plant and insect race)Atk based on level 10.

* Judgement Cross
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 0.5 seconds delay after skill.
- Reduces SP consumption from 150 to 105 based on level 10.
- Reduces AP consumption from 150 to 10.
- Increases damage from 7500%/11000%(plant and insect race)Matk to 19500%/21000%(plant and insect race)Matk based on level 10.
2023-08-12 15:01:31 +02:00
Atemo
b3ddb4511c
Rebalance dragon knight 20220608 (#7891)
* Vigor
- Changes bonus flat damage from +200% regardless of skill level to scaling with skill level up to +250% based on level 10.
- Increases bonus damage against demihuman and angel race monsters from 50% to 100%.
- Reduces AP consumption from 150 to 125.
- Increases HP consumption on each attack from 2 to 10 based on level 10.

* Dragonic Aura
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases damage from 9500%/14000%(demihuman and angel race)Atk to 36500%/38000%(demihuman and angel race)Atk based on level 10.

* Madness Crusher
- Removes 0.4 seconds variable casting time.
- Increases fixed casting time from 0.4 seconds to 0.5 seconds.
- Increases damage from 1350%Atk to 5150%Atk based on level 5 (using level 5 weapon and weapon weight is 150). (additional note: 4400% Atk on level 5 without weapon weight)
- Increases SP consumption from 50 to 68 based on level 5.
- Increases AP recovery rate from 2 to 3.
- Increases factor weight of POW in skill formula from 5 to 7.

* Storm Slash
- Reduces cooldown from 0.35 seconds to 0.3 seconds.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 600%Atk to 950%Atk per hit based on level 5.
- Increases the chance to double skill damage while under Giant Growth buff from 15% to 30%.

* Servant Weapon - Demolition
- Reduces cooldown from 3 seconds to 0.5 seconds.
- Reduces AP recovery rate from 3 to 2.
- Increases damage from 750%Atk to 2500%Atk per hit based on level 5.

* Servant Weapon - Phantom
- Removes 0.8 seconds variable casting time.
- Reduces cooldown from 2 seconds to 0.5 seconds.
- Removes 0.8 seconds delay after skill.
- Increases damage from 600%Atk to 1700%Atk per hit based on level 5.

* Servant Weapon
- Increases number of hit from 1 hit to 2 hits.
- Increases damage from 450%Atk to 2500%Atk per hit based on level 5.

* Hack and Slasher
- Changes damage logic from 2 split hits to 2 cumulative hits.
- Increases damage from 3000%Atk to 7300%Atk per hit based on level 10.
- Increases cooldown from 0.3 seconds to 0.7 seconds.
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 70 to 72 based on level 10.
- Increases factor weight of POW in skill formula from 5 to 7.

Thanks to @aleos89 !
2023-08-10 17:56:58 +02:00
Atemo
e30951a032
Rebalance archmage 20220608 (#7889)
* Floral Flare Road
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 70 to 94 based on level 5.
- Increases damage from 1000%Matk to 3750%Matk per hit based on level 5.

* Rain of Crystal
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 80 to 100 based on level 5.
- Increases damage from 750%Matk to 3980%Matk per hit based on level 5.

* Tornado Storm
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 75 to 94 based on level 5.
- Increases damage from 450%Matk to 3900%Matk per hit based on level 5.

* Stratum Tremor
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 75 to 94 based on level 5.
- Increases damage from 1250%Matk to 3750%Matk per hit based on level 5.

* Crimson Arrow
- Reduces SP consumption from 105 to 94 based on level 5.
- Increases AP recovery rate from 1 to 2.

* Frozen Slash
- Increases cooldown from 0.3 seconds to 0.45 seconds.
- Increases SP consumption from 85 to 96 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 3000%/4250%(Climax)Matk to 4750%/6650%(Climax)Matk based on level 5.

* Storm Cannon
- Reduces SP consumption from 100 to 94 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 3000%/4250%(Climax)Matk to 4750%/6250%(Climax)Matk based on level 5.

* Rock Down
- Increases SP consumption from 85 to 92 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 3000%/4250%(Climax)Matk to 4750%/6250%(Climax)Matk based on level 5.

* All Bloom
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 100 to 126 based on level 5.
- Increases damage from 500%Matk to 6200%Matk per hit based on level 5.
- No longer reduce skill damage on Climax level 2.
- Increases bonus damage on Climax level 3 from 100% to 300%.
- Increases damage of additional explosion on Climax level 5.

* Crystal Impact
- Reduces cooldown from 6 seconds to 2 seconds.
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 120 to 132 based on level 5.
- Increases damage from 4000%/4000%(secondary)Matk to 6750%/6750%(secondary)Matk based on level 5.

* Destructive Hurricane
- Reduces cooldown from 6 seconds to 2 seconds.
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 120 to 132 based on level 5.
- Increases damage from 8000%Matk to 14250%Matk based on level 5.
- Increases bonus damage on Climax level 3 from 100% to 200%.
- Reduces bonus damage on Climax level 5 from 70% to 50%.

Skipped (unknown value)
- Increases damage of additional hit on Climax level 1.

* Violent Quake
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 100 to 126 based on level 5.
- Increases damage from 600%Matk to 6200%Matk per hit based on level 5.
- Increases bonus damage on Climax level 3 from 100% to 200%.

* Deadly Projection
- Reduces SP consumption from 120 to 90 based on level 5.
- Increases damage from 3600%Matk to 14000%Matk based on level 5.

* Mystery Illusion
- Reduces delay after skill from 1 second to 0.5 seconds.
- Reduces SP consumption from 120 to 110 based on level 5.
- Increases AP recovery rate from 4 to 5.
- Increases damage from 2500%Matk to 4750%Matk per hit based on level 5.

* Astral Strike
- Reduces cooldown from 60 second to 6 seconds.
- Reduces SP consumption from 150 to 130.
- Reduces AP consumption from 150 to 25.
- Increases initial damage from 5000%/11000%(undead and dragon race)Matk to 18000%/21400%(undead and dragon race)Matk based on level 10.
- Increases over time damage from 2000%Matk to 6500%Matk per hit based on level 10.
- Reduces skill duration from 15 seconds to 6 seconds.

* Soul Vulcan Strike
- Increases damage from 900%Matk to 1250%Matk per hit based on level 5.
- Reduces SP consumption from 120 to 110 based on level 5.
2023-08-08 15:07:31 +02:00
Atemo
f4b9748e1f
Rebalance elemental master 20220608 (#7888)
* Conflagration
- Increases SP consumption from 110 to 113 based on level 5.
- Increases damage from 2000%/4000%(spirit)Matk to 3750%/5750%(spirit)Matk per hit based on level 5.

* Diamond Storm
- Reduces cooldown from 2 seconds to 1 second.
- Reduces SP consumption from 100 to 96 based on level 5.
- Increases damage from 6250%/12250%(spirit)Matk to 8150%/14400%(spirit)Matk based on level 5.
- Increases factor weight of SPL in skill formula from 5/7(spirit) to 5/10(spirit).

* Lightning Land
- Increases SP consumption from 95 to 110 based on level 5.
- Increases damage from 2000%/4000%(spirit)Matk to 3750%/5750%(spirit)Matk per hit based on level 5.

* Terra Drive
- Reduces cooldown from 2 seconds to 1 second.
- Reduces SP consumption from 100 to 96 based on level 5.
- Increases damage from 6250%/12250%(spirit)Matk to 8150%/14400%(spirit)Matk based on level 5.
- Increases factor weight of SPL in skill formula from 5/7(spirit) to 5/10(spirit).

* Corrected the SPL weight of EM_DIAMOND_STORM and EM_TERRA_DRIVE

* Venom Swamp
- Increases SP consumption from 100 to 112 based on level 5.
- Increases damage from 2000%/4000%(spirit)Matk to 3750%/5750%(spirit)Matk per hit based on level 5.

* Elemental Buster
- Reduces fixed casting time from 2 seconds to 1.5 seconds.
- Reduces cooldown from 60 seconds to 5 seconds.
- Reduces delay after skill from 1.5 seconds to 0.5 seconds.
- Reduces SP consumption from 150 to 140.
- Reduces AP consumption from 150 to 30.
- Increases damage from 4800%/11000%(formless and dragon race)Matk to 22500%/24000%(formless and dragon race)Matk based on level 10.
2023-08-07 22:20:12 +02:00
Atemo
bf1e1b77c8
Update/rebalance abyss chaser 20220608 (#7879)
* Abyss Dagger
- Increases SP consumption from 60 to 64 based on level 5.
- Increases damage from 1750%Atk to 2600%Atk per hit based on level 5.

* Deft Stab
- Increases SP consumption from 55 to 62 based on level 10.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 3600%Atk to 5850%Atk based on level 10.
- Increases area of effect from 5 x 5 cells to 7 x 7 cells based on level 10.

* From the Abyss
- Increases number of hit from 1 hit to 2 hits.
- Increases damage from 500%Matk to 2600%Matk per hit based on level 5.

* Abyss Square
- Increases AP recovery rate from 4 to 5.
- Increases damage from 2000%Matk to 3850%Matk per hit based on level 5 (Magic Sword Mastery level 10).

* Chain Reaction Shot
- Reduces cooldown from 1.5 seconds to 1 second.
- Removes 0.5 seconds delay after skill.
- Reduces SP consumption from 80 to 75 based on level 5.
- Increases area of effect of secondary damage from 3 x 3 cells to 7 x 7 cells.
- Increases area of effect of primary damage from 7 x 7 cells to 9 x 9 cells based on level 5.
- Increases damage from 3000%(primary)/4750%(secondary)Atk to 4250%(primary)/12350%(secondary)Atk based on level 5.
- Increases factor weight of CON in skill formula from 5 to 15.

* Frenzy Shot
- Reduces SP consumption from 125 to 55 based on level 10.
- Increases damage from 3500%Atk to 4000%Atk per hit based on level 10.

* Omega Abyss Strike
- Reduces cooldown from 60 seconds to 3 seconds.
- Reduces SP consumption from 150 to 125.
- Reduces AP consumption from 150 to 15.
- Increases damage from 6000%/11500%(angel and demon race)Matk to 22000%/23500%(angel and demon race)Matk based on level 10.
2023-08-07 18:12:54 +02:00
idk-whoami
d75fb9b64e
Corrected script for some item #22 (#7843)
Thanks to @Atemo
2023-08-07 14:47:52 +02:00
Vincent Stumpf
047e5eef6d
Bypass drop restriction in mpa_addflooritem when dropping (#7847) 2023-08-04 22:51:55 -07:00
Singe Horizontal
af602d5535
Call script_hasdata before script_getnum in addrid (#7876)
* Fixes #7875.
* Calling script_hasdata before script_getnum in addrid
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-08-04 12:02:35 -04:00
Atemo
40b2d0ff13
Rebalance biolo 20220608 (#7877)
* Full Shadow Protection
- Increases duration from 60 seconds to 180 seconds base on level 4.

* Research Report
- Reduces fixed casting time from 1 second to 0.5 seconds.
- Reduces cooldown from 120 seconds to 60 seconds.
- Increases duration from 60 seconds to 150 seconds.

* Acidified Zone (Water)/(Fire)/(Wind)/(Ground)
- Reduces cooldown from 1 second to 0.5 seconds.
- Reduces delay after skill from 0.5 seconds to 0.15 seconds.
- Reduces SP consumption from 88 to 63 based on level 5.
- Increases number of hit from 5 hits to 7 hits.

* Bionic Pharmacy
- The crafting materials of Icycle/Earth/Gale/Flame Acid Bottle have been changed, reduces amount of Bottle Grenade and Acid Bottle used from 5 each to 1 each, changes materials from elemental ore to elemental point.
2023-08-03 16:58:59 +02:00
Atemo
266194f928
Rebalance inquisitor 20220608 (#7874)
* First Brand
- Reduces cooldown from 0.5 seconds to 0.3 seconds.
- Increases SP consumption from 50 to 62 based on level 5.
- Unifies brand duration to 5 second regardless of skill level.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases cast range from 2 cells to 3 cells.
- Increases damage from 2250%Atk to 6000%Atk based on level 5.

Already implemented
- Increases factor weight of POW in skill formula from 3 to 5.

* Second Faith
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases SP consumption from 60 to 65 based on level 5.
- Increases AP recovery rate from 1 to 4.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 2500%Atk to 11600%Atk based on level 5.

Already implemented:
- Increases factor weight of POW in skill formula from 4 to 5.

* Second Judgement
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases SP consumption from 65 to 70 based on level 5.
- Increases AP recovery rate from 2 to 4.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 2625%Atk to 13150%Atk based on level 5.
- Increases factor weight of POW in skill formula from 4 to 7.

* Second Flame
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases SP consumption from 70 to 75 based on level 5.
- Increases AP recovery rate from 3 to 4.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 2750%Atk to 14700%Atk based on level 5.
- Increases factor weight of POW in skill formula from 4 to 9.

* Third Punish
- Reduces cooldown from 2 seconds to 1 second.
- Increases number of hit from 2 hits to 3 hits.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 3250%Atk to 7850%Atk per hit based on level 5.
- Increases factor weight of POW in skill formula from 5 to 10.

* Third Consecration
- Reduces cooldown from 2 seconds to 1 second.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 3250%Atk to 3500%Atk per hit based on level 5.
- Increases factor weight of POW in skill formula from 5 to 10.

* Oleum Sanctum
- Reduces cooldown from 3 seconds to 2 seconds.
- Removes 0.5 seconds delay after skill.
- Increases SP consumption from 70 to 85 based on level 5.
- Increases damage from 2000%Atk to 10500%Atk based on level 5.
- Increases area of effect from 7 x 7 cells to 11 x 11 cells based on level 5.

Already implemented
- Increases factor weight of POW in skill formula from 3 to 5.

* Explosion Blaster
- Reduces cooldown from 1 second to 0.7 seconds.
- Reduces SP consumption from 120 to 90 based on level 5.
- Increases damage from 3250%/4250%(Oleum Sanctum)Atk to 14000%/16000%(Oleum Sanctum)Atk per hit based on level 5.
- Increases area of effect from 9 x 9 cells to 11 x 11 cells based on level 5.
- Increases factor weight of POW in skill formula from 3/5 to 15/15.

* First Faith Power
- Reworks cooldown from 30~150 seconds to 180~60 seconds (level 1~5).
- Unifies duration to 300 seconds regardless of skill level.

* Judge
- Reworks cooldown from 30~150 seconds to 180~60 seconds (level 1~5).
- Unifies duration to 300 seconds regardless of skill level.
- Changes AP consumption from 50 regardless of skill level to scaling with skill level, from 80 on level 1 down to 40 on level 5.

* Third Exorcism Flame
- Reworks cooldown from 30~150 seconds to 180~60 seconds (level 1~5).
- Unifies duration to 300 seconds regardless of skill level.
- Changes AP consumption from 100 regardless of skill level to scaling with skill level, from 120 on level 1 down to 60 on level 5.

* Massive Flame Blaster
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 1 second delay after skill.
- Reduces AP consumption from 150 to 12.
- Increases damage from 8000%/11000%(demon and brute race)Atk to 21500%/23000%(demon and brute race)Atk based on level 10.
- Increases area of effect from 9 x 9 cells to 11 x 11 cells.
- Increases factor weight of POW in skill formula from 10/10(demon and brute race) to 15/15(demon and brute race).
- Reduces duration of Massive Flame Blaster buff from 300 seconds to 150 seconds.
2023-08-02 20:15:06 +02:00
Atemo
4ce3c460e5
Rebalance cardinal 20220608 (#7871)
* Framen
- Increases SP consumption from 60 to 92 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 2750%/3500%(demon and undead race)Matk to 4250%/4750%(demon and undead race)Matk based on level 5 (Fidus Animus level 10).

* Arbitrium
- Reduces cooldown from 2 seconds to 1.5 seconds.
- Reduces SP consumption from 140 to 112 based on level 10.
- Increases damage from 5000%/6500%(area damage)Matk to 11000%/13500%(area damage)Matk based on level 10.

Additional:
- Updated the factor weight of SPL in skill formula to 7 (according to the next rebalance)

* Petitio
- Reduces cooldown from 1 second to 0.5 seconds.
- Increases SP consumption from 50 to 65 based on level 10.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 3200%Atk to 11500%Atk based on level 10 (Mace & Book Mastery Level 10).

* Competentia
- Reduces AP consumption from 200 to 160 based on level 5.
- Increases duration from 240 seconds to 300 seconds based on level 5.

* Pneumaticus Procella
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 1.5 seconds delay after skill.
- Reduces AP consumption from 150 to 30.
- Increases damage from 2030%/3050%(demon and undead race)Matk to 21180%/22750%(demon and undead race)Matk per hit based on level 10 (Fidus Animus level 10).

* Effligo
- Reduces cooldown from 60 seconds to 0.5 seconds.
- Removes 1 seconds delay after skill.
- Increases SP consumption from 60 to 75.
- Reduces AP consumption from 100 to 12.
- Increases damage from 8080%/12150%(demon and undead race)Atk to 16580%/18150%(demon and undead race)Atk based on level 10 (Mace & Book Mastery Level 10).
- Reduces factor weight of POW in skill formula from 10/10(demon and undead race) to 7/7(demon and undead race).

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-08-02 14:40:11 +02:00
Atemo
0a87d2f3d6
Rebalance windhawk 20220608 (#7859)
* Hawk Rush
- Increases damage from 1000%Atk to 2500%Atk based on level 5.

* Gale Storm
- Reduces cooldown from 2 seconds to 1.5 seconds.
- Increases damage from 2500%Atk to 9500%Atk based on level 10.

Skipped, not enough info (the values have been changed again)
- Reduces SP consumption from 179 to 100 based on level 10.

* Crescive Bolt
- Reduces delay after skill from 0.5 seconds to 0.3 seconds.
- Reduces SP consumption from 100 to 65 based on level 10.
- Increases damage from 3000%Atk to 3400%Atk based on level 10.
- When reach 3 stacks of Crescive Bolt consecutive attack buff, the duration of buff will be refreshed when reusing Crescive Bolt.

* Deep Blind Trap / Solid Trap / Swift Trap / Flame Trap
- Reduces cooldown to 2.5 seconds.
- Increases SP consumption from 62 to 84 based on level 5.
- Increases area of effect to 7 x 7 cells based on level 5.
- Reduces trap duration to 5 seconds.
- Changes damage interval to 0.5 seconds.
- Reduces AP recovery rate from 4 to 3 based on level 5.
- No longer inflict status ailment to the target.
- Increases damage from 1250%Atk to 4250%Atk per hit based on level 5.

Note: already implemented
- Increases factor weight of CON in skill formula from 3 to 5.

* Hawk Boomerang
- Adds 0.15 seconds cooldown.
- Reduces SP consumption from 120 to 80.
- Reduces AP consumption from 15 to 12.
- Increases damage from 2500%Atk to 3000%Atk based on level 5.

* Updated Gale Storm
- Reduces SP consumption from 179 to 100 based on level 10.

Additionally:
- Updated Crescive Bolt ratio (+10% each hit)
2023-08-01 18:45:14 +02:00
Atemo
c16473eb94
Rebalance meister 20220608 (#7862)
* Axe Stomp
- Reduces cooldown from 1 second to 0.7 seconds.
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 45 to 74 based on level 5.
- Increases duration of Axe Stomp buff from 10 seconds to 30 seconds based on level 5.
- Increases damage from 2000%Atk to 4600%Atk per hit based on level 5.

* Rush Quake
- Removes 0.5 seconds delay after skill.
- Increases damage from 7500%/11000%(formless and insect race)Atk to 36000%/37500%(formless and insect race)Atk based on level 10.
2023-07-31 21:25:20 +02:00
Atemo
d4c7614d80
Correction of the critical formula (renewal) (#7865)
* 1 luk = +0.3 critical
* BaseLevel / 10 = +0.1 critical

Fixed #7865
2023-07-30 14:41:16 +02:00
Atemo
953ec517d4
Follow-up 8d49496177 (#7867)
Corrected a mistake for Eternal Slash
- The total factor weight of POW with Shadow Exceed should be 3.
2023-07-30 01:07:33 +02:00
Atemo
8d49496177
Rebalance shadow cross 20220608 (#7858)
* Savage Impact
- Increases SP consumption from 55 to 72 based on level 10.
- Increases area of effect from 3 x 3 cells to 5 x 5 cells.
- Increases damage from 600%/1000%(Shadow Exceed)Atk to 900%/1100%(Shadow Exceed)Atk per hit based on level 10.

* Eternal Slash
- Reduces cooldown from 0.75 seconds to 0.5 seconds.
- Reduces damage from 1750%/2500%(Shadow Exceed)Atk to 1325%/1825%(Shadow Exceed)Atk per hit based on level 5.
- Increases SP consumption from 40 to 60 based on level 5.
- Increases cast range from 2 cells to 3 cells.
- Reduces factor weight of POW in skill formula from 5/7(Shadow Exceed) to 2/3(Shadow Exceed).

* Impact Crater
- Reduces cooldown from 5 seconds to 1.5 seconds.
- Removes delay after skill.
- Increases SP consumption from 54 to 78 based on level 5.
- Reduces AP recovery rate from 5 to 3.
- Increases damage from 325%Atk to 400%Atk per hit based on level 5.

* Shadow Stab
- Reduces SP consumption from 65 to 60 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Reduces cooldown from 1 seconds to 0.35 seconds.
- Removes 0.5 seconds delay after skill.
- Reduces damage from 3750%Atk to 1500%Atk per hit based on level 5.

* Potent Venom
- Increases duration from 120 seconds to 300 seconds based on level 10.
- Reduces physical resistance ignoring from 30% to 20% based on level 10.

* Fatal Shadow Claw
- Reduces fixed casting time from 1.5 seconds to 0.5 seconds.
- Reduces variable casting time from 4 seconds to 0.5 seconds.
- Removes 0.5 seconds delay after skill.
- Increases damage from 6500%/9500%(demihuman and dragon race)Atk to 13000%/14500%(demihuman and dragon race)Atk based on level 10.

* Shadow Exceed
- Removes 1 second delay after skill.
- Reduces AP consumption from 150 to 125 based on level 10.
- Increases duration from 240 seconds to 300 seconds based on level 10.

* Added POW ratio for SHC_SAVAGE_IMPACT with SC_SHADOW_EXCEED
2023-07-28 16:18:06 +02:00
Vietlubu
9e17fa776c
Update combo Victory_Wing_Ear_ with Convertible (#7837)
Add Joy - Lens - Bat Enchant

Update Joy_Of_Victory
Refer: https://ro.gnjoy.com/news/probability/View.asp?category=6&seq=4025577&curpage=1

Add Lens_Craft_Stone enchant
Refer: https://ro.gnjoy.com/news/probability/View.asp?category=6&seq=4111812&curpage=1

Add Overclocker enchant
Refer: https://ro.gnjoy.com/news/probability/View.asp?category=6&seq=4071221&curpage=2
2023-07-24 16:03:44 +02:00
Ahmed Shawky
9ddd26f1e2
Corrected an Illusion investigation NPC name (#7851) 2023-07-24 15:54:06 +02:00
amirkhaki
b3741bbd3c
Update README.md (#7849)
* Fixes C++ reference.
2023-07-19 12:25:58 -04:00
idk-whoami
fe4234cd39
Corrected script for some item #21 (#7830)
Thanks to @Atemo
2023-07-11 15:50:29 +02:00
eppc0330
c979ed7472
NPC_MAGICMIRROR damage type (#7480)
* The damage type reflected by NPC_MAGICMIRROR is now special melee weapon damage.
* Skill damage reflected by NPC_MAGICMIRROR is now able to trigger autospell.
* Kyomu will block NPC_MAGICMIRROR reflecting ability.
* Calculation of reducing reflect damage now additive, not multiplicative.
2023-07-10 09:51:32 -04:00
eppc0330
511c337ee3
Fix multi-hit skills priority (#7829) 2023-07-09 16:26:29 -07:00
Aleos
70d9f118d8
Revert "Adds buy/sell safety check for Market Shops" (#7839) 2023-07-05 13:19:04 -04:00
aleos
4cb368cdb1 Merge branch 'hotfix/marketshop_sell' 2023-07-05 13:15:59 -04:00
Lemon
5860524bdd
fix(docs): fixed wrong effect description (#7838) 2023-07-04 19:18:48 -07:00
Jittapan Pluemsumran
458a9d8950
Fixed potential crash in RODex (#7833) 2023-07-03 19:39:54 -07:00
Vincent Stumpf
f20f8b01be
Fix maximum ratio for MOB_ITEM_RATIO_DB (#7836)
Fixes #7835
2023-07-03 19:19:18 -07:00
Atemo
e304472638
Initial release of Illusion of Twins (#7524)
Thanks to @Lemongrass3110 !
2023-07-03 21:32:19 +02:00
Atemo
fbd0478864
Illusion of underwater daily quests (#7834)
* Fixed logic when the quests were in cooldown
2023-07-01 15:02:10 +02:00
Jittapan Pluemsumran
b6d6f09fd7
Fixed wrong index check in clif_parse_laphine_synthesis (#7832) 2023-06-28 16:14:47 +02:00
Lemongrass3110
89dbf89830 Divine Pride Monster Sync 2023-06-26 19:46:18 +02:00
idk-whoami
2ba2473489
Corrected script for some item #20 (#7818) 2023-06-21 19:43:35 +02:00
Pokye
f6d9acdd69
Old Card Album and Mystical Card Album Update (#7820)
Fixed #7730
2023-06-21 18:38:37 +02:00
Kanin Temsrisuk
f79419687a
Fixed items script bonus typo / wrong location (#7824) 2023-06-21 17:20:08 +02:00
Vincent Stumpf
d6ba042e1e
Upgrade yaml-cpp to remove warning (#7825) 2023-06-18 22:39:49 -07:00
Vincent Stumpf
711705df10
Upgrade to C++17 (#7811)
* Upgrade to C++17
2023-06-16 20:07:23 -07:00
Vincent Stumpf
833966f47b
Convert guild_db to unordered_map (#7612)
* Refactor guild db to STL container

* Split up struct guild and MapGuild/CharGuild
2023-06-16 19:42:55 -07:00
mazvi
39cdaa6b84
Fixes produce item requirements (#7814)
* Corrects the produce item requirements for Rough Wind, Great Nature, Earth Elemental Converter, and Wind Elemental Converter.
2023-06-16 13:41:24 -04:00
Aleos
b331958381
Adds option to set item buy/sell values to 0 (#7808)
* Fixes #7790.
* Arrows and Traps are now sold for 0 Zeny to shops.
* Adjusts the item database loadingFinished check to now accept 0 as a valid value for buy/sell and not attempt to adjust the buy/sell value when only one is defined.
Thanks to @Atemo and @mazvi!
Co-authored-by: Vincent Stumpf <vincents.995@gmail.com>
2023-06-16 13:24:07 -04:00
Pokye
cfac5bb769
Added Missing Recall Skills (#7815) 2023-06-16 13:07:32 -04:00
Atemo
8d7239d1a4
Initial release of illusion investigation quests (#7813) 2023-06-13 16:50:59 +02:00
Aleos
c1a52490b1
Resolves an issue with RENEWAL_ASPD (#6959)
* Fixes #6900.
* Resolves an issue where if RENEWAL was enabled but RENEWAL_ASPD was disabled, players would receive incorrect ASPD values.
* Split the ASPD values to their own files so these can be overridden based on the macro defines.
Thanks to @jamesonfajardo and @bgamez23!
Co-authored-by: Vincent Stumpf <vincents.995@gmail.com>
2023-06-12 09:28:38 -04:00
Aleos
33d20fa91a
Resolves movable skill unit stack (#7435)
* Resolves movable skill unit stack
* Fixes #1270.
* Resolves an issue where movable skill units, such as Guild Skills, would stack on cells and not properly clear on an object's death.
* Increases the limit from 20 to size_t.
Thanks to @RadianFord and @gidzdlcrz!

* Minor reversions
* Set back to global array rather than scoping it to unit_data.
* Adjusted array to vector so it's large enough to handle a bigger stack.

Thanks to @vstumpf!
2023-06-12 00:35:11 -07:00
Kanin Temsrisuk
8fd752f9cd
Fix wrong bow location (#7809) 2023-06-10 15:05:16 +02:00
idk-whoami
83ef1e72c2
Corrected script for some item #19 (#7786) 2023-06-10 15:02:30 +02:00
Atemo
aa8f501388
Added atcommand "setcard" (#7804)
Thanks to @aleos89 and @Lemongrass3110 !
2023-06-08 20:08:26 +02:00
Atemo
38d335a267
Added more information for atcommand refine (#7803) 2023-06-08 14:01:43 +02:00
Aleos
5b832de199
Minor cleanup to mapflags (#7782)
* Adds missing documentation for mf_norodex.
* Updates atcommand mapflag to display information on some missing mapflags.
* Removes "Other Flags2" and combine list with "Other Flags" for atcommand mapflag.
2023-06-07 10:11:32 -04:00
Vincent Stumpf
e5ec2b2ef8
Fix issue with bonus3 bAddEffOnSkill (#7805) 2023-06-06 18:23:37 -07:00
aleos
5339b455c0 Fixes Para Market Jewel seller prices 2023-06-06 10:58:49 -04:00
Lemongrass3110
6f5706a945
Added support for really big cashshops (#7763)
Added some malloc reporting
Forward socket allocation information
Forward WFIFOHEAD allocation information
Cleanup to clif_cashshop_show
Cleanup to clif_cashshop_result
Cleanup to clif_cashshop_list

Fixes #7757

Thanks to @ChiesaV
2023-06-04 21:36:48 +02:00
mazvi
e7ac2b26dd
Small update of Illusion of Underwater (#7800)
* Added the old coordinates (commented) of the npc "Jerrymon"
2023-06-04 20:56:49 +02:00
Singe Horizontal
75faf9ac1a
Fixes npc last path caching (#7769)
Fixes #7766
2023-06-03 19:56:04 -07:00
Vincent Stumpf
08a1c41d1b
Refactor MapFlag accessors (#7783)
Use methods instead of direct member access.
2023-06-03 17:38:29 -07:00
aleos
8073c3026a Adds buy/sell safety check for Market Shops
* Adds a buy and sell safety check from the Market Shop type.
* Also includes an item validation check when loading items from SQL for Market Shops.
Thanks to @mazvi!
2023-06-02 15:41:49 -04:00
Aleos
2c61b336bc
Fixes Lux Anima status not applying (#7796)
* Fixes #7793.
* Follow up to 7913eda.
* Adds missing sc_start after cleaning up previous check.
Thanks to @mazvi!
2023-06-02 15:00:36 -04:00
eppc0330
466722b25e
Simplify GC_POISONREACT counter formula (#7795)
* Cleanup of #5805.
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2023-06-02 14:59:40 -04:00
Aleos
4c9280728a
Fixes a party check for Weekend Dungeon (#7797)
* Fixes #7776.
* Adjusts the party checks to account for leader versus member.
Thanks to @grimexile and @Atemo!
2023-06-02 14:57:20 -04:00
mazvi
8e56967c83
Fix minor typo in Illusion of Underwater (#7791)
* Resolves an issue with the Gatekeeper sending the player to the wrong menu option.
2023-06-02 14:16:54 -04:00
Aleos
7913eda1e6
Fixes Lux Anima applying Giant Growth (#7792)
* Adds a missing break which was resulting in Lux Anima attempting to cast the Giant Growth Rune.
* This is in conjunction with the revamp of this skill not applying other Runes effects anymore.
2023-06-01 15:15:27 -04:00
Atemo
251cfa2c9c
Implemented new items up to may 17 2023 (#7767)
* Implemented new items up to may 17 2023
* Added base data for 1st floor biosphere map
2023-05-28 16:55:53 +02:00
Aleos
fab88ecd04
Follow up to ba86a76 (#7784)
* Fixes #7770.
* Follow up to ba86a76.
* Adds a missing cap rate option for bSkillCooldown which wouldn't allow addition/reduction more than 10000 milliseconds.
Thanks to @attackjom and @sonniez!
2023-05-26 12:45:57 -04:00
Daegaladh
8c059b5b2e
Updated the Spanish translation of map-server messages (#7785)
Thanks to @Artuvazro for his suggestions and review
2023-05-26 17:20:05 +02:00
Aleos
fc27b45d9f
Resolves inverted checks for Rebirth Spirit (#7780)
* Fixes #7779.
* Skill should be usable on all 1-1 rebirth classes that are below level 70.
Thanks to @XanKriegor1 and @Lemongrass3110!
2023-05-23 22:50:16 -04:00
Kanin Temsrisuk
ecf0174a55
Fix typo and empty mob drop (#7775) 2023-05-23 22:18:16 -04:00
Pokye
9907721a69
Added a mapflag to block BANK (#7773) 2023-05-22 12:23:46 -04:00
Stolao
ccd7e5c14a
Added debug output to navi.cpp (#7765)
Add Loading info to write_npc_distances() for resolving potential halts
2023-05-17 14:20:10 +02:00
SapitoSucio
7c18321138
Enabling EPOLL in cmake command (#7764) 2023-05-17 14:19:06 +02:00
Lemongrass3110
5443d566a7 Always trigger CI on CMakeList changes
Thanks to @secretdataz
2023-05-17 11:06:19 +02:00
Lemongrass3110
a4a8e58ba1
Little cleanup of skill_additional_effect (#7762)
Fixes #7759

Thanks to @grimexile
2023-05-16 18:42:19 +02:00
Singe Horizontal
8fd3e2d5e2
Fixed a cant.attack bypass (#7753)
Fixed a pointer being always null

Fixes #7743

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-05-16 16:17:28 +02:00
Aleos
af28882a6f
Removes player item bonus rate cap warnings (#7754)
* Removes all of the warnings that were displayed when players had item bonuses that eventually reached the min/max rate.
* The rate is already capped so the warning was just a redundant message that could spam the console.
2023-05-16 10:16:49 -04:00
Vincent Stumpf
016e3570aa
Fix incorrect script constants (#7758) 2023-05-15 11:19:53 -07:00
Atemo
fcf0b5d821
Corrected NPC Count when reloading scripts (#7756)
Fixed #7691

Thanks to @Akkarinage
2023-05-13 19:01:48 +02:00
Atemo
b4b69a2cc1
Fixed an issue where mobs instantly walked after being spotted (#7738)
* Fixed an issue where mobs instantly walked after being spotted
  MIN_RANDOMWALKTIME was initialized too early
* This behavior is only applied on the monster script command
2023-05-12 00:34:36 +02:00
Jittapan Pluemsumran
d3b99e6dc1
Fixed market response packet when purchase fails (#7751)
The item list was still sent to the client even when the purchase failed because p->result is no longer 0 in PACKETVER >= 20190807.
2023-05-10 20:44:08 +07:00
mazvi
dfa7e5e084
Rename Upgrade SQL (#7742) 2023-05-03 21:15:53 -04:00
Atemo
84bf6b87f1
Fixed an issue for map_drops.yml (#7735)
The key for umap should be the index, to allow to define the same item in yaml file
2023-04-26 23:35:24 +02:00
Atemo
6308b4feaf Follow-up d7840cd265
Added missing delitem

Thanks to @tumemmac
2023-04-26 22:31:32 +02:00
Atemo
d7840cd265
Einbech dungeon 3 (#7209)
* Implemented dungeons, merchants and quests related to einbech 3

Thanks to @Pokye !
2023-04-26 18:39:24 +02:00
Singe Horizontal
4718d5e813
Added new status flag RequireNoWeapon (#7201)
* Fixes #7200.
* Added new status flag RequireNoWeapon.
2023-04-24 12:01:24 -04:00
Singe Horizontal
b4be3b059a
Prevent an uint underflow and reformat array_size occurences in some commands (#7729)
Fixes #7728
2023-04-22 19:42:13 -07:00
Singe Horizontal
9051fc644d
Corrected NPC_DARKBREATH formula (#7285)
* Corrected NPC_DARKBREATH formula
Fixes #7284

* Update src/map/battle.cpp

Co-authored-by: Pokye <98105181+Pokye@users.noreply.github.com>

* Update src/map/battle.cpp

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

* Added renewal logic

* now uses only one formula for both modes

---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Pokye <98105181+Pokye@users.noreply.github.com>
2023-04-20 10:13:37 +02:00
Singe Horizontal
9df8f9f113
Corrects a short-circuit bug in status_change_clear_buffs (#7724)
Fixes #7723
2023-04-19 15:55:44 -07:00
idk-whoami
ea65c1b9ba
ViewID correction of item IDs 20765 (#7720)
Fixed #7697 

Thanks to @llchrisll
2023-04-18 17:17:31 +02:00
Lemongrass3110
339adbbe2d
Fixes the pincode system (#7719)
Fixes #7700

Thanks to @24msz6eo, @Melk3000 and @vstumpf
2023-04-17 18:20:15 +02:00
Vincent Stumpf
579dea8fad
Add debug logs for debugging client connections (#7701) 2023-04-16 22:47:06 -07:00
Atemo
665eb969ed
Corrected animation of the skill SHC_SAVAGE_IMPACT (#7717)
* Fixed an issue where the client did not update the position of the player
* Additionally fixed the player direction when the player casts the skill while being on the same cell of the target
2023-04-16 22:59:19 +02:00
Atemo
939567d361
Fixed an issue with cloak*npc (#7715)
* all the npcs saved in pc should be removed on map change
2023-04-16 14:58:47 +02:00
munkrej
635add84d7
4th Improvement - Troubadour & Trouvere (#7703) 2023-04-16 00:38:19 +02:00
munkrej
5385584f6f
4th Improvement - Wind Hawk (#7704) 2023-04-15 23:37:19 +02:00
munkrej
16195cea2a
4th Improvement - Inquisitor (#7705) 2023-04-15 23:36:30 +02:00
munkrej
a818232e77
4th Improvement - Cardinal (#7706) 2023-04-15 23:16:26 +02:00
munkrej
741dfe37ae
4th Improvement - Elemental Master (#7707) 2023-04-15 22:52:20 +02:00
munkrej
e4acd6e5dc
4th Improvement - Arch Mage (#7708) 2023-04-15 22:52:03 +02:00
munkrej
452238b523
4th Improvement - Abyss Chaser (#7709) 2023-04-15 18:45:51 +02:00
munkrej
6c8b29e91b
4th Improvement - Shadow Cross (#7710) 2023-04-15 17:46:18 +02:00
munkrej
287501d665
4th Improvement - Biolo (#7711) 2023-04-15 17:43:30 +02:00
munkrej
e1e19a6d06
4th Improvement - Meister (#7712) 2023-04-15 17:31:19 +02:00
munkrej
382d6bf54a
4th Improvement - Imperial Guard (#7713) 2023-04-15 16:53:39 +02:00
munkrej
e40c3edc31
4th Improvement - Dragon Knight (#7714) 2023-04-15 16:04:59 +02:00
Vincent Stumpf
a2f4f2bf8e
Do not call pet_set_intimate twice (#7702) 2023-04-15 15:02:41 +02:00
munkrej
22aca36d35
Adds enchantgrade chance per refine (#7608)
Fixes #7607

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-04-14 23:43:33 +02:00
Lemongrass3110
18ec884ba8 Removed a duplicate function call in erasequest
Thanks to @Pokye
2023-04-12 22:33:21 +02:00
Everade
7853e926c2
Episode 17.2 - Sage's Legacy (#6799)
* Episode 17.2 Initial Release of instances and quests
* Added warp portals and monster spawn scripts
* Added Episode 17.2 related database entries

Closed #6470 

Thanks to @Megelith @Pokye 

Co-authored-by: JohnnyPlayy <JohnnyPlayy@users.noreply.github.com>
Co-authored-by: Everade <privacy@gatheringro.com>
Co-authored-by: crazyarashi <26841779+crazy-arashi@users.noreply.github.com>
Co-authored-by: Atemo <capucrath@gmail.com>
2023-04-12 21:27:34 +02:00
Atemo
c7b464b91f
Initial release of Illusion of underwater (#7521)
Implemented the main quest, daily quests and exchange npcs related to illusion of underwater.
Walkthrough Conversion.

Closed #6472 

Thanks to @secretdataz @OptimusM !

Co-authored-by: aleos <aleos89@users.noreply.github.com>
2023-04-12 20:20:23 +02:00
Atemo
0413d0e85c
Initial release of Illusion of Luanda (#7559)
* Implemented the main quest, daily quests and exchange npcs related to Illusion of Luanda.
Fixed #6462 

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-04-12 18:38:26 +02:00
Everade
2a4a82315b
Episode 16.2 - Friday Memorial Dungeon (#7300)
* Implementation of Episode 16.2 Friday Memorial Dungeon.

Fixed #6452

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-04-12 17:40:53 +02:00
Everade
36a2c9783f
Episode 16.1 - Edda Half Moon In The Daylight (#7298)
* Implementation of the Episode 16.1 - Edda Half Moon In The Daylight - Memorial Dungeon (quests and exchange NPCs)

Thanks to @Pokye @OptimusM @idk-whoami !

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2023-04-12 14:03:33 +02:00
Atemo
0fbe8c3ecd
Fixed an issue with npc_enable_target (#7695)
Fixed #7694 

Thanks to @eppc0330
2023-04-12 01:50:03 +02:00
Atemo
806c89edb3
Updated the NPC structure (#6923)
* added the possibility to define the state (hidden, cloaked, disabled) of the npc/warp in the npc definition

Thanks to @Daegaladh
2023-04-10 23:53:16 +02:00
Atemo
801c3c782e
Updated disablenpc/enablenpc (#7671)
* Updated disablenpc/enablenpc script commands using OPTION_HIDE instead of OPTION_INVISIBLE, to correctly display the effects when the npcs are disabled/enabled. The other behaviors are kept.
2023-04-10 23:06:55 +02:00
Atemo
66c05937b5
Added mag_dun03 quests (#7207)
* Implemented mobs, quests
* Updated MAGMA_ESSENCE and added MAGMA3 option group

Thanks to @Pokye
2023-04-10 17:07:42 +02:00
Vincent Stumpf
ab6c5beaf8
Fix out-of-bounds in TypesafeCachedYamlDatabase (#7690)
Fixes #7664

Thanks to @jofvgaming
2023-04-09 21:49:30 +02:00
Vincent Stumpf
d2e972cfd1
Fix Undeclared HEADER_ZC_SEARCH_STORE_INFO_ACK 2010-08-03 (#7679) 2023-04-09 20:34:52 +02:00
Atemo
c12d5ed6b7
Initial release of Illusion of Turtle (#7465)
* Implemented the main quest, daily quests and exchange npcs related to illusion of turtle
* Implemented the random option groups of the items given in the dungeon

Thanks to :
@attackjom 
@idk-whoami 
@OptimusM 
@Pokye 

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-04-09 20:00:45 +02:00
Atemo
c2f44f5fcb
Implemented new items up to april 05 2023 (#7682) 2023-04-08 17:32:49 +02:00
Atemo
74b2834502
Updates map_drops.yml (#7676)
* adjusted the rate in map_drops.yml to 1/100000 instead of 1/10000

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-04-08 16:48:01 +02:00
eppc0330
8a4b34ef6a
Fix NPC_DAMAGE_HEAL heal calculation (#7660)
Fix NPC_DAMAGE_HEAL heal amount not being applied from some SC bonuses
2023-04-08 15:42:09 +02:00
Austin Wang
cf0264be45
Fix some items' names for Alberta stylish npc (#7666)
Co-authored-by: Jittapan Pluemsumran <nightsheep@outlook.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-04-08 14:39:26 +02:00
Atemo
370ee1e876
Added amicitia1 and amicitia2, dungeons level 200 (#7336)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Thanks to @OptimusM !
2023-04-07 15:42:55 +02:00
Atemo
b7807db42f
Implemented NPC_GROUNDDRIVE (#7677) 2023-04-07 14:56:08 +02:00
Atemo
db5874d677
Updated unitskilluseid and unitskillusepos script commands (#7684)
* Added the parameter 'ignore_range' to ignore the skill range defined in skill_db.yml
2023-04-07 01:09:44 +02:00
Atemo
fff69b0cfd
Added missing combo Phreeoni_Wing_Suits + Phreeoni_Egg (#7680)
Fixed #7393

Thanks to @eppc0330
2023-04-07 01:05:43 +02:00
Atemo
6136f7df35
Updated achievement_db.yml (#7681) 2023-04-06 15:46:20 +02:00
Atemo
1a5072c153
Added new maps up to April 05 2023 (#7683) 2023-04-06 14:54:07 +02:00
Aleos
65200eba50
Fixes an issue with clones receiving 1 damage (#7670)
* Fixes #7579.
* Adds an extra conditional check for reducing Green Aura type mobs to ignore cloned monsters.
Thanks to @vietlubu and @Lemongrass3110!
2023-04-03 18:47:53 -04:00
idk-whoami
70736c9b1d
Corrected script for some item #18 (#7644)
Thanks to @Atemo
2023-04-03 14:40:52 +02:00
Atemo
d031afe364
Implemented the skill NPC_RAINOFMETEOR (#7675) 2023-04-02 21:30:08 +02:00
Atemo
81b62348b7
Implemented the skills NPC_RELIEVE_ON and NPC_RELIEVE_OFF (#7614)
* Implemented the skills NPC_RELIEVE_ON and NPC_RELIEVE_OFF as part of episode 17.2

Thanks to @aleos89 !
2023-03-31 19:52:35 +02:00
Atemo
eff3b2014b
Removed NoForcedEnd for SC_MONSTER_TRANSFORM (#7655) 2023-03-31 15:12:06 +02:00
Atemo
c06fed6b56
DB update - Aegis item name (#7661)
* Updated several Aegis item names DB
2023-03-28 14:48:25 +02:00
Atemo
f8c5cd9552
Small correction on the attribute table (#7662)
Follow-up e4e8063ec3

* Defense Wind and Fire values have been reversed for Undead weapon element.
* There should be no negative defense according to the official tables.

Thanks to @vstumpf
2023-03-25 14:13:45 +01:00
Atemo
6673e1a786
Fixed an issue where normal NPC had no sprite when walking (#7652)
* Fixed an issue where normal NPC had no sprite when walking
* Added a note

Thannks to @vstumpf
2023-03-24 15:28:50 +01:00
Lemongrass3110
49ba072f3a
Added returning to instances (#7622)
Fixes #5226

Thanks to @Forte22, @attackjom and @OptimusM

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-03-23 15:49:39 +01:00
Vincent Stumpf
8abf9960a0
Fix memory leak on map quit (#7657) 2023-03-23 12:11:15 +01:00
Vincent Stumpf
f0e374ea23
Fixes getrefine failing in OnEquip/OnUnequip scripts (#7592) 2023-03-20 10:08:04 -07:00
Vincent Stumpf
819b7cb361
Fix ASAN crashes and LSAN leaks (#7649) 2023-03-20 09:32:41 -07:00
Lemongrass3110
4d9b1a0b83
Deduplicate strlib code (#7651)
Follow up to 4e64623
2023-03-19 21:07:16 +01:00
Atemo
1ccdc17df5
Added some entries in instance_db.yml (#7654)
* Added some entries in instance_db.yml
2023-03-19 20:24:00 +01:00
Lemongrass3110
b95daa3041 Fixed wrong node usage for instance loading
Noticed because of #7654
2023-03-19 19:10:42 +01:00
Atemo
36972bf9ea
Corrected the english name of several items in item DB (#7653) 2023-03-19 17:51:31 +01:00
Vincent Stumpf
4e646235d2
Fix builds that don't use the memory manager (#7648) 2023-03-18 23:57:44 -07:00
Jittapan Pluemsumran
b4f740ce18
Added a config for banking state check (#7646)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-16 20:24:13 +07:00
Atemo
19bbd82c55
Initial release of nif_dun quests (#7349)
* Added mobs db, mobs spawn and quests related to nif_dun01 and nif_dun02
* Some data after rebalance is missing but the base is there

Thanks to @aleos89 @Lemongrass3110 @Pokye @OptimusM @Tokeiburu for the reviews !
2023-03-16 13:24:32 +01:00
eppc0330
067c21b647
Implement NPC_DAMAGE_HEAL and NPC_IMMUNE_PROPERTY (#7638)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-15 21:36:47 +01:00
Jittapan Pluemsumran
22abdf8dbe
Added missing state checks in banking functions (#7645)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-14 17:34:05 +07:00
Vincent Stumpf
7dd6eb5182
Add other player in mail transactions (#7568)
* Add other player's char_id in mail transactions

Thanks to @tokeiburu

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-14 02:30:23 -07:00
munkrej
cbb5380527
Adds skill NPC_KILLING_AURA (#7624) 2023-03-14 00:14:41 +01:00
Lemongrass3110
ae2ea3df10
Implemented NPC_WIDELEASH (#7643) 2023-03-13 22:46:23 +01:00
Lemongrass3110
6ff1ebfa98
Implemented NPC_LEASH (#7642) 2023-03-13 21:36:50 +01:00
Atemo
3f45df1025
Added news items - equipments up to 03022023 (#7625) 2023-03-13 13:50:21 +01:00
eppc0330
eb875d1af5
Implement NPC_MOVE_COORDINATE (#7636) 2023-03-13 06:55:50 +01:00
eppc0330
bee2c27d78
Implement NPC_ALL_STAT_DOWN (#7637) 2023-03-13 06:25:02 +01:00
eppc0330
b3881bd1fc
Implement NPC_GRADUAL_GRAVITY (#7635) 2023-03-13 00:25:47 +01:00
Vincent Stumpf
1c35482ecf
Change copied bl type to BL_NUL for delayed clif_clearunit (#7640)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-12 12:38:47 -07:00
idk-whoami
3998f7ed75
Corrected script for some item #17 (#7616)
Thanks to @Atemo
2023-03-08 15:10:50 +01:00
Vincent Stumpf
8f4a1d2932
Remove relative includes for 3rdparty imports (#7609)
This also changes the imports for config, custom to use the src include path
2023-03-07 16:21:28 -08:00
Vincent Stumpf
1b1164f91d
Change memcpy for safestrncpy for char * (#7629) 2023-03-06 09:53:23 -08:00
Vincent Stumpf
6a0b7afd88
Fix possible out of bounds (#7630) 2023-03-06 09:37:26 -08:00
aoshfan
bb8c4a03c8
Fix Fire Pillar skill to not consume Gemstone if VIP or use Mistress card (#7623) 2023-03-05 17:04:24 -08:00
userid0
b22e186e77
Cleanup homun txt in map-server-generator (#7627) 2023-03-04 18:44:18 +01:00
idk-whoami
b56f11207c
Update warper npc (#7617) 2023-02-28 19:48:34 +01:00
Lemongrass3110
839d378680 Added missing breaks to instance_warpall 2023-02-26 22:37:07 +01:00
Jittapan Pluemsumran
1985662045
Made debug ShowStatus calls easier to disable (#7618)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-02-21 11:34:52 +07:00
Atemo
08d3467faa
Updated item names and fix an issue with ignore_res_by_race / ignore_mres_by_race (#7613) 2023-02-16 22:41:15 +01:00
Aleos
240f71cbce
Converts Homunculus Database to YAML (#4659)
* Converts the Homunculus Database and Homunculus Skill Tree Database into one YAML flat file.
* General cleanups and optimizations.
* Includes CSV2YAML converter.
Thanks to @Lemongrass3110 and @Atemo!
Co-authored-by: Atemo <capucrath@gmail.com>
2023-02-15 14:42:51 -05:00
Atemo
b2ceb30e30
Added missing items equipment up to 02/10/2023 (#7606)
* Added missing items equipment up to 02/10/2023
* Implemented the item bonuses bIgnoreResRaceRate and bIgnoreMResRaceRate

Thanks to @attackjom for the review!
2023-02-15 16:15:11 +01:00
Vincent Stumpf
a35063dfd6
Upgrade to c++14 (#7593) 2023-02-13 10:58:31 -08:00
Everade
56ae2174c0
Episode 16.2 - Weekend Memorial Dungeon (#7299)
* Implementation of Episode 16.2 Weekend Memorial Dungeon.

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-02-13 14:25:52 +01:00
munkrej
c6c9babb5e
Homunculus updates as of 20220602 (#7586)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-02-12 23:55:13 +01:00
Lemongrass3110
42d8c163b7
Added missing columns for yaml2sql (#7603)
Fixes #7602

Thanks to @Triedge
2023-02-12 23:04:46 +01:00
Vincent Stumpf
9d2bcc7a70
Change npc_src_files linked list to vector (#7598) 2023-02-12 13:38:12 -08:00
Vincent Stumpf
e235c9cab4
Change common and config includes to use <> (#7596) 2023-02-12 12:46:06 -08:00
Vincent Stumpf
eff6131087
Speed up loading of npcs and maps (#7597) 2023-02-12 11:01:14 -08:00
Atemo
bc7b9cdd2e
Updated instance_warpall script command (#7591)
* Added a parameter to the instance_warpall script command to prevent dead players from being warped

Thanks to @aleos89, @Lemongrass3110 and @vstumpf for the reviews!
2023-02-12 16:09:20 +01:00
idk-whoami
36bcfaecee
Corrected script for some items #16 (#7583)
Thanks to @Atemo
2023-02-12 15:33:11 +01:00
Lemongrass3110
98b3f2af52
Removed some useless strlib functions (#7600)
* Removed jstrescape

* Removed jstrescapecpy

* Removed jmemescapecpy

* Removed J_MAX_MALLOC_SIZE

* Removed trim2
2023-02-12 13:08:24 +01:00
Vincent Stumpf
7629ff4032
Speed up loading CachedYamlDBs (#7599)
Instead of iterating from the end to find the last item in the cache, just store the highest key we've found.
Then, resize the cache to that
2023-02-12 00:20:54 -08:00
Vincent Stumpf
ce8f053359
Speed up YAML DB loading by removing ShowStatus (#7595) 2023-02-10 16:04:35 -08:00
idk-whoami
56af701ade
Corrected script for some item #15 (#7566)
Thanks to @Atemo
2023-02-10 15:14:26 +01:00
673 changed files with 383607 additions and 89905 deletions

9
.git-blame-ignore-revs Normal file
View File

@ -0,0 +1,9 @@
# Massive EOL normalization & 'svn:eol-style native' flag setting for all txt/conf/h/c files.
# https://github.com/rathena/rathena/commit/637ae9a4dcde0d5885a18841d2f3875e06893c30
637ae9a4dcde0d5885a18841d2f3875e06893c30
# Applied AStyle code formating as discussed on tid:74602.
# https://github.com/rathena/rathena/commit/a7c32653f70bd420bdf5a621acdf3aea5c6e6002
a7c32653f70bd420bdf5a621acdf3aea5c6e6002
# Undid r16968: SVN Replaced with source:/trunk/src/@16966 (tid:74924).
# https://github.com/rathena/rathena/commit/a2bdc47dafb32f6d18ed350d8bbe79b8f679a049
a2bdc47dafb32f6d18ed350d8bbe79b8f679a049

View File

@ -38,11 +38,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
with:
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
@ -74,7 +74,7 @@ jobs:
#- name: Autobuild
# uses: github/codeql-action/autobuild@v2
# ✏️ If the Autobuild fails above, remove it and uncomment the following
# ?? If the Autobuild fails above, remove it and uncomment the following
# three lines and modify them (or add more) to build your code if your
# project uses a compiled language
- name: Command - configure
@ -89,4 +89,4 @@ jobs:
run: make server
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

View File

@ -34,7 +34,7 @@ jobs:
clang: ['6.0', '7', '8', '9', '10', '11'] #, '12', '13']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Set up Clang
uses: egor-tensin/setup-clang@v1

View File

@ -18,6 +18,8 @@ on:
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs:
build:
@ -32,7 +34,7 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
# Install latest CMake.
- uses: lukka/get-cmake@latest

View File

@ -31,10 +31,14 @@ jobs:
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['9', '10', '11']
gcc: ['9', '10', '11', '12']
# GCC 13 was removed from 22.04, include it as a separate job
include:
- os: ubuntu-24.04
gcc: 13
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
@ -45,8 +49,10 @@ jobs:
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }}'
# -Werror: to treat all warnings as errors
# -Wno-error=builtin-declaration-mismatch: otherwise ./configure checks fail
run: ./configure $CONFIGURE_FLAGS --enable-buildbot=yes CXXFLAGS='-Werror -Wno-error=builtin-declaration-mismatch'
- name: Command - make clean
run: make clean

View File

@ -36,7 +36,7 @@ jobs:
mode: ['PRE','RE']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE

View File

@ -34,15 +34,15 @@ jobs:
mode: ['PRE', 'RE']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.1
uses: microsoft/setup-msbuild@v2
- name: Build solution in Debug
if: ${{ matrix.mode == 'PRE' }}
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT%3BPRERE"
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT%3BPRERE" /warnaserror
- name: Build solution in Debug
if: ${{ matrix.mode == 'RE' }}
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT"
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT" /warnaserror

View File

@ -38,7 +38,7 @@ jobs:
packetver: ['20211103', '20200902', '20200401', '20180620', '20151104']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE

View File

@ -36,7 +36,7 @@ jobs:
mode: ['PRE', 'RE']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE

View File

@ -39,7 +39,7 @@ jobs:
mode: ['PRE', 'RE']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE

1
3rdparty/README.txt vendored
View File

@ -7,3 +7,4 @@ mysql - library for MySQL Community Server (http://www.mysql.com)
pcre - library for Perl Compatible Regular Expressions (http://www.pcre.org)
zlib - library for DEFLATE lossless compression algorithm (http://www.zlib.net)
json - library for nlohmann json (https://github.com/nlohmann/json/tree/4b2c8ce6bcfe7f39f2bb9e680c1e7a4d67c2dd48)
yaml-cpp - library for yaml (https://github.com/jbeder/yaml-cpp/tree/0e6e28d1a38224fc8172fae0109ea7f673c096db)

View File

@ -98,6 +98,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -112,6 +113,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -128,6 +130,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -146,6 +149,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>

View File

@ -108,6 +108,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -122,6 +123,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -138,6 +140,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -156,6 +159,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>

View File

@ -2,6 +2,11 @@
#line 4 "scanner.c"
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( disable : 4267 )
#endif
#define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */
@ -2365,3 +2370,7 @@ void libconfig_yyfree (void * ptr , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables"
#line 192 "scanner.l"
#ifdef _MSC_VER
#pragma warning( pop )
#endif

View File

@ -103,6 +103,7 @@
<PreprocessorDefinitions>WIN32;_WINDOWS;CMAKE_INTDIR="Debug";_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ObjectFileName>$(IntDir)</ObjectFileName>
<LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;CMAKE_INTDIR=\"Debug\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -138,6 +139,7 @@
<PreprocessorDefinitions>WIN32;_WINDOWS;CMAKE_INTDIR="Debug";_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ObjectFileName>$(IntDir)</ObjectFileName>
<LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;CMAKE_INTDIR=\"Debug\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -173,6 +175,7 @@
<DebugInformationFormat>
</DebugInformationFormat>
<LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CMAKE_INTDIR=\"Release\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -208,6 +211,7 @@
<DebugInformationFormat>
</DebugInformationFormat>
<LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CMAKE_INTDIR=\"Release\";%(PreprocessorDefinitions)</PreprocessorDefinitions>

View File

@ -21,6 +21,7 @@ set( YAML_HEADERS
"${YAML_INCLUDE_DIRS}/yaml-cpp/ostream_wrapper.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/null.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noncopyable.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noexcept.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/mark.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/exceptions.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/eventhandler.h"
@ -30,6 +31,7 @@ set( YAML_HEADERS
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitterdef.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitfromevents.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/dll.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/depthguard.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/binary.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/anchor.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/type.h"
@ -46,6 +48,7 @@ set( YAML_HEADERS
set( YAML_SOURCES
"${YAML_SOURCE_DIR}/binary.cpp"
"${YAML_SOURCE_DIR}/convert.cpp"
"${YAML_SOURCE_DIR}/depthguard.cpp"
"${YAML_SOURCE_DIR}/directives.cpp"
"${YAML_SOURCE_DIR}/emit.cpp"
"${YAML_SOURCE_DIR}/emitfromevents.cpp"
@ -81,3 +84,4 @@ set( YAML_DEFINITIONS
include_directories(${YAML_INCLUDE_DIRS} ${YAML_SOURCE_DIR})
#message(STATUS "YAML_INCLUDE_DIRS : ${YAML_INCLUDE_DIRS}, YAML_SOURCE_DIR=${YAML_SOURCE_DIR}")
ADD_LIBRARY(${this_target} STATIC ${YAML_SOURCES} )
target_compile_definitions(${this_target} PUBLIC "-DYAML_CPP_STATIC_DEFINE")

View File

@ -4,7 +4,7 @@ YAML_CPP_DIR_OBJ = $(YAML_CPP_OBJ:%=obj/%)
YAML_CPP_H = $(shell find * -type f -name "*.h")
YAML_CPP_AR = obj/yaml-cpp.a
CXXFLAG =-std=c++11
CXXFLAG =-std=c++17 -DYAML_CPP_STATIC_DEFINE
INC=-Iinclude
@SET_MAKE@

View File

@ -10,7 +10,7 @@
#include <cstddef>
namespace YAML {
typedef std::size_t anchor_t;
using anchor_t = std::size_t;
const anchor_t NullAnchor = 0;
}

View File

@ -19,9 +19,13 @@ YAML_CPP_API std::vector<unsigned char> DecodeBase64(const std::string &input);
class YAML_CPP_API Binary {
public:
Binary() : m_unownedData(0), m_unownedSize(0) {}
Binary(const unsigned char *data_, std::size_t size_)
: m_unownedData(data_), m_unownedSize(size_) {}
: m_data{}, m_unownedData(data_), m_unownedSize(size_) {}
Binary() : Binary(nullptr, 0) {}
Binary(const Binary &) = default;
Binary(Binary &&) = default;
Binary &operator=(const Binary &) = default;
Binary &operator=(Binary &&) = default;
bool owned() const { return !m_unownedData; }
std::size_t size() const { return owned() ? m_data.size() : m_unownedSize; }
@ -35,7 +39,7 @@ class YAML_CPP_API Binary {
rhs.clear();
rhs.resize(m_unownedSize);
std::copy(m_unownedData, m_unownedData + m_unownedSize, rhs.begin());
m_unownedData = 0;
m_unownedData = nullptr;
m_unownedSize = 0;
} else {
m_data.swap(rhs);
@ -62,6 +66,6 @@ class YAML_CPP_API Binary {
const unsigned char *m_unownedData;
std::size_t m_unownedSize;
};
}
} // namespace YAML
#endif // BASE64_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -22,6 +22,7 @@ namespace YAML {
template <class T>
class AnchorDict {
public:
AnchorDict() : m_data{} {}
void Register(anchor_t anchor, T value) {
if (anchor > m_data.size()) {
m_data.resize(anchor);
@ -34,6 +35,6 @@ class AnchorDict {
private:
std::vector<T> m_data;
};
}
} // namespace YAML
#endif // ANCHORDICT_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -15,10 +15,12 @@ class Parser;
// GraphBuilderInterface
// . Abstraction of node creation
// . pParentNode is always NULL or the return value of one of the NewXXX()
// . pParentNode is always nullptr or the return value of one of the NewXXX()
// functions.
class GraphBuilderInterface {
public:
virtual ~GraphBuilderInterface() = 0;
// Create and return a new node with a null value.
virtual void *NewNull(const Mark &mark, void *pParentNode) = 0;
@ -71,9 +73,9 @@ class GraphBuilder : public GraphBuilderInterface {
typedef typename Impl::Map Map;
GraphBuilder(Impl &impl) : m_impl(impl) {
Map *pMap = NULL;
Sequence *pSeq = NULL;
Node *pNode = NULL;
Map *pMap = nullptr;
Sequence *pSeq = nullptr;
Node *pNode = nullptr;
// Type consistency checks
pNode = pMap;

View File

@ -0,0 +1,77 @@
#ifndef DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000
#define DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
#endif
#include "exceptions.h"
namespace YAML {
/**
* @brief The DeepRecursion class
* An exception class which is thrown by DepthGuard. Ideally it should be
* a member of DepthGuard. However, DepthGuard is a templated class which means
* that any catch points would then need to know the template parameters. It is
* simpler for clients to not have to know at the catch point what was the
* maximum depth.
*/
class DeepRecursion : public ParserException {
public:
virtual ~DeepRecursion() = default;
DeepRecursion(int depth, const Mark& mark_, const std::string& msg_);
// Returns the recursion depth when the exception was thrown
int depth() const {
return m_depth;
}
private:
int m_depth = 0;
};
/**
* @brief The DepthGuard class
* DepthGuard takes a reference to an integer. It increments the integer upon
* construction of DepthGuard and decrements the integer upon destruction.
*
* If the integer would be incremented past max_depth, then an exception is
* thrown. This is ideally geared toward guarding against deep recursion.
*
* @param max_depth
* compile-time configurable maximum depth.
*/
template <int max_depth = 2000>
class DepthGuard final {
public:
DepthGuard(int & depth_, const Mark& mark_, const std::string& msg_) : m_depth(depth_) {
++m_depth;
if ( max_depth <= m_depth ) {
throw DeepRecursion{m_depth, mark_, msg_};
}
}
DepthGuard(const DepthGuard & copy_ctor) = delete;
DepthGuard(DepthGuard && move_ctor) = delete;
DepthGuard & operator=(const DepthGuard & copy_assign) = delete;
DepthGuard & operator=(DepthGuard && move_assign) = delete;
~DepthGuard() {
--m_depth;
}
int current_depth() const {
return m_depth;
}
private:
int & m_depth;
};
} // namespace YAML
#endif // DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000

View File

@ -1,33 +1,61 @@
#ifndef DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#define DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
// Definition YAML_CPP_STATIC_DEFINE using to building YAML-CPP as static
// library (definition created by CMake or defined manually)
// Definition yaml_cpp_EXPORTS using to building YAML-CPP as dll/so library
// (definition created by CMake or defined manually)
#ifdef YAML_CPP_STATIC_DEFINE
# define YAML_CPP_API
# define YAML_CPP_NO_EXPORT
#else
# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
# ifndef YAML_CPP_API
# ifdef yaml_cpp_EXPORTS
/* We are building this library */
# pragma message( "Defining YAML_CPP_API for DLL export" )
# define YAML_CPP_API __declspec(dllexport)
# else
/* We are using this library */
# pragma message( "Defining YAML_CPP_API for DLL import" )
# define YAML_CPP_API __declspec(dllimport)
# endif
# endif
# ifndef YAML_CPP_NO_EXPORT
# define YAML_CPP_NO_EXPORT
# endif
# else /* No _MSC_VER */
# ifndef YAML_CPP_API
# ifdef yaml_cpp_EXPORTS
/* We are building this library */
# define YAML_CPP_API __attribute__((visibility("default")))
# else
/* We are using this library */
# define YAML_CPP_API __attribute__((visibility("default")))
# endif
# endif
# ifndef YAML_CPP_NO_EXPORT
# define YAML_CPP_NO_EXPORT __attribute__((visibility("hidden")))
# endif
# endif /* _MSC_VER */
#endif /* YAML_CPP_STATIC_DEFINE */
#ifndef YAML_CPP_DEPRECATED
# ifdef _MSC_VER
# define YAML_CPP_DEPRECATED __declspec(deprecated)
# else
# define YAML_CPP_DEPRECATED __attribute__ ((__deprecated__))
# endif
#endif
// The following ifdef block is the standard way of creating macros which make
// exporting from a DLL simpler. All files within this DLL are compiled with the
// yaml_cpp_EXPORTS symbol defined on the command line. This symbol should not
// be defined on any project that uses this DLL. This way any other project
// whose source files include this file see YAML_CPP_API functions as being
// imported from a DLL, whereas this DLL sees symbols defined with this macro as
// being exported.
#undef YAML_CPP_API
#ifndef YAML_CPP_DEPRECATED_EXPORT
# define YAML_CPP_DEPRECATED_EXPORT YAML_CPP_API YAML_CPP_DEPRECATED
#endif
#ifdef YAML_CPP_DLL // Using or Building YAML-CPP DLL (definition defined
// manually)
#ifdef yaml_cpp_EXPORTS // Building YAML-CPP DLL (definition created by CMake
// or defined manually)
// #pragma message( "Defining YAML_CPP_API for DLL export" )
#define YAML_CPP_API __declspec(dllexport)
#else // yaml_cpp_EXPORTS
// #pragma message( "Defining YAML_CPP_API for DLL import" )
#define YAML_CPP_API __declspec(dllimport)
#endif // yaml_cpp_EXPORTS
#else // YAML_CPP_DLL
#define YAML_CPP_API
#endif // YAML_CPP_DLL
#ifndef YAML_CPP_DEPRECATED_NO_EXPORT
# define YAML_CPP_DEPRECATED_NO_EXPORT YAML_CPP_NO_EXPORT YAML_CPP_DEPRECATED
#endif
#endif // DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#endif /* DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 */

View File

@ -24,21 +24,21 @@ class EmitFromEvents : public EventHandler {
public:
EmitFromEvents(Emitter& emitter);
virtual void OnDocumentStart(const Mark& mark);
virtual void OnDocumentEnd();
void OnDocumentStart(const Mark& mark) override;
void OnDocumentEnd() override;
virtual void OnNull(const Mark& mark, anchor_t anchor);
virtual void OnAlias(const Mark& mark, anchor_t anchor);
virtual void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value);
void OnNull(const Mark& mark, anchor_t anchor) override;
void OnAlias(const Mark& mark, anchor_t anchor) override;
void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value) override;
virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnSequenceEnd();
void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnSequenceEnd() override;
virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnMapEnd();
void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnMapEnd() override;
private:
void BeginNode();

View File

@ -7,16 +7,18 @@
#pragma once
#endif
#include <cmath>
#include <cstddef>
#include <limits>
#include <memory>
#include <sstream>
#include <string>
#include <type_traits>
#include "yaml-cpp/binary.h"
#include "yaml-cpp/dll.h"
#include "yaml-cpp/emitterdef.h"
#include "yaml-cpp/emittermanip.h"
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/null.h"
#include "yaml-cpp/ostream_wrapper.h"
@ -28,10 +30,12 @@ struct _Null;
namespace YAML {
class EmitterState;
class YAML_CPP_API Emitter : private noncopyable {
class YAML_CPP_API Emitter {
public:
Emitter();
explicit Emitter(std::ostream& stream);
Emitter(const Emitter&) = delete;
Emitter& operator=(const Emitter&) = delete;
~Emitter();
// output
@ -55,6 +59,7 @@ class YAML_CPP_API Emitter : private noncopyable {
bool SetPostCommentIndent(std::size_t n);
bool SetFloatPrecision(std::size_t n);
bool SetDoublePrecision(std::size_t n);
void RestoreGlobalModifiedSettings();
// local setters
Emitter& SetLocalValue(EMITTER_MANIP value);
@ -120,6 +125,7 @@ class YAML_CPP_API Emitter : private noncopyable {
void SpaceOrIndentTo(bool requireSpace, std::size_t indent);
const char* ComputeFullBoolName(bool b) const;
const char* ComputeNullName() const;
bool CanEmitNewline() const;
private:
@ -153,7 +159,27 @@ inline Emitter& Emitter::WriteStreamable(T value) {
std::stringstream stream;
SetStreamablePrecision<T>(stream);
stream << value;
bool special = false;
if (std::is_floating_point<T>::value) {
if ((std::numeric_limits<T>::has_quiet_NaN ||
std::numeric_limits<T>::has_signaling_NaN) &&
std::isnan(value)) {
special = true;
stream << ".nan";
} else if (std::numeric_limits<T>::has_infinity && std::isinf(value)) {
special = true;
if (std::signbit(value)) {
stream << "-.inf";
} else {
stream << ".inf";
}
}
}
if (!special) {
stream << value;
}
m_stream << stream.str();
StartedScalar();
@ -250,6 +276,6 @@ inline Emitter& operator<<(Emitter& emitter, _Indent indent) {
inline Emitter& operator<<(Emitter& emitter, _Precision precision) {
return emitter.SetLocalPrecision(precision);
}
}
} // namespace YAML
#endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -27,6 +27,12 @@ enum EMITTER_MANIP {
DoubleQuoted,
Literal,
// null manipulators
LowerNull,
UpperNull,
CamelNull,
TildeNull,
// bool manipulators
YesNoBool, // yes, no
TrueFalseBool, // true, false
@ -37,10 +43,6 @@ enum EMITTER_MANIP {
LongBool, // yes, On
ShortBool, // y, t
// null manipulators
NullAsTilde, // ~
NullAsNull, // null
// int manipulators
Dec,
Hex,
@ -79,14 +81,14 @@ struct _Alias {
std::string content;
};
inline _Alias Alias(const std::string content) { return _Alias(content); }
inline _Alias Alias(const std::string& content) { return _Alias(content); }
struct _Anchor {
_Anchor(const std::string& content_) : content(content_) {}
std::string content;
};
inline _Anchor Anchor(const std::string content) { return _Anchor(content); }
inline _Anchor Anchor(const std::string& content) { return _Anchor(content); }
struct _Tag {
struct Type {
@ -101,11 +103,11 @@ struct _Tag {
Type::value type;
};
inline _Tag VerbatimTag(const std::string content) {
inline _Tag VerbatimTag(const std::string& content) {
return _Tag("", content, _Tag::Type::Verbatim);
}
inline _Tag LocalTag(const std::string content) {
inline _Tag LocalTag(const std::string& content) {
return _Tag("", content, _Tag::Type::PrimaryHandle);
}
@ -113,7 +115,7 @@ inline _Tag LocalTag(const std::string& prefix, const std::string content) {
return _Tag(prefix, content, _Tag::Type::NamedHandle);
}
inline _Tag SecondaryTag(const std::string content) {
inline _Tag SecondaryTag(const std::string& content) {
return _Tag("", content, _Tag::Type::NamedHandle);
}
@ -122,7 +124,7 @@ struct _Comment {
std::string content;
};
inline _Comment Comment(const std::string content) { return _Comment(content); }
inline _Comment Comment(const std::string& content) { return _Comment(content); }
struct _Precision {
_Precision(int floatPrecision_, int doublePrecision_)

View File

@ -17,7 +17,7 @@ struct Mark;
class EventHandler {
public:
virtual ~EventHandler() {}
virtual ~EventHandler() = default;
virtual void OnDocumentStart(const Mark& mark) = 0;
virtual void OnDocumentEnd() = 0;
@ -34,7 +34,12 @@ class EventHandler {
virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) = 0;
virtual void OnMapEnd() = 0;
virtual void OnAnchor(const Mark& /*mark*/,
const std::string& /*anchor_name*/) {
// empty default implementation for compatibility
}
};
}
} // namespace YAML
#endif // EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -7,19 +7,8 @@
#pragma once
#endif
#ifndef NOEXCEPT
#ifdef _MSC_VER
#ifdef _NOEXCEPT
#define NOEXCEPT _NOEXCEPT
#else
#define NOEXCEPT
#endif // ifdef _NOEXCEPT
#else
#define NOEXCEPT noexcept
#endif // ifdef _MSC_VER
#endif // ifdef NOEXCEPT
#include "yaml-cpp/mark.h"
#include "yaml-cpp/noexcept.h"
#include "yaml-cpp/traits.h"
#include <sstream>
#include <stdexcept>
@ -76,7 +65,7 @@ const char* const ZERO_INDENT_IN_BLOCK =
const char* const CHAR_IN_BLOCK = "unexpected character in block scalar";
const char* const AMBIGUOUS_ANCHOR =
"cannot assign the same alias to multiple nodes";
const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined";
const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined: ";
const char* const INVALID_NODE =
"invalid node; this may result from using a map iterator as a sequence "
@ -111,6 +100,12 @@ inline const std::string KEY_NOT_FOUND_WITH_KEY(const std::string& key) {
return stream.str();
}
inline const std::string KEY_NOT_FOUND_WITH_KEY(const char* key) {
std::stringstream stream;
stream << KEY_NOT_FOUND << ": " << key;
return stream.str();
}
template <typename T>
inline const std::string KEY_NOT_FOUND_WITH_KEY(
const T& key, typename enable_if<is_numeric<T>>::type* = 0) {
@ -118,13 +113,48 @@ inline const std::string KEY_NOT_FOUND_WITH_KEY(
stream << KEY_NOT_FOUND << ": " << key;
return stream.str();
}
template <typename T>
inline const std::string BAD_SUBSCRIPT_WITH_KEY(
const T&, typename disable_if<is_numeric<T>>::type* = nullptr) {
return BAD_SUBSCRIPT;
}
inline const std::string BAD_SUBSCRIPT_WITH_KEY(const std::string& key) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
inline const std::string BAD_SUBSCRIPT_WITH_KEY(const char* key) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
template <typename T>
inline const std::string BAD_SUBSCRIPT_WITH_KEY(
const T& key, typename enable_if<is_numeric<T>>::type* = nullptr) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
inline const std::string INVALID_NODE_WITH_KEY(const std::string& key) {
std::stringstream stream;
if (key.empty()) {
return INVALID_NODE;
}
stream << "invalid node; first invalid key: \"" << key << "\"";
return stream.str();
}
} // namespace ErrorMsg
class YAML_CPP_API Exception : public std::runtime_error {
public:
Exception(const Mark& mark_, const std::string& msg_)
: std::runtime_error(build_what(mark_, msg_)), mark(mark_), msg(msg_) {}
virtual ~Exception() NOEXCEPT;
~Exception() YAML_CPP_NOEXCEPT override;
Exception(const Exception&) = default;
@ -135,7 +165,7 @@ class YAML_CPP_API Exception : public std::runtime_error {
static const std::string build_what(const Mark& mark,
const std::string& msg) {
if (mark.is_null()) {
return msg.c_str();
return msg;
}
std::stringstream output;
@ -150,7 +180,7 @@ class YAML_CPP_API ParserException : public Exception {
ParserException(const Mark& mark_, const std::string& msg_)
: Exception(mark_, msg_) {}
ParserException(const ParserException&) = default;
virtual ~ParserException() NOEXCEPT;
~ParserException() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API RepresentationException : public Exception {
@ -158,7 +188,7 @@ class YAML_CPP_API RepresentationException : public Exception {
RepresentationException(const Mark& mark_, const std::string& msg_)
: Exception(mark_, msg_) {}
RepresentationException(const RepresentationException&) = default;
virtual ~RepresentationException() NOEXCEPT;
~RepresentationException() YAML_CPP_NOEXCEPT override;
};
// representation exceptions
@ -167,7 +197,7 @@ class YAML_CPP_API InvalidScalar : public RepresentationException {
InvalidScalar(const Mark& mark_)
: RepresentationException(mark_, ErrorMsg::INVALID_SCALAR) {}
InvalidScalar(const InvalidScalar&) = default;
virtual ~InvalidScalar() NOEXCEPT;
~InvalidScalar() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API KeyNotFound : public RepresentationException {
@ -177,7 +207,7 @@ class YAML_CPP_API KeyNotFound : public RepresentationException {
: RepresentationException(mark_, ErrorMsg::KEY_NOT_FOUND_WITH_KEY(key_)) {
}
KeyNotFound(const KeyNotFound&) = default;
virtual ~KeyNotFound() NOEXCEPT;
~KeyNotFound() YAML_CPP_NOEXCEPT override;
};
template <typename T>
@ -185,7 +215,7 @@ class YAML_CPP_API TypedKeyNotFound : public KeyNotFound {
public:
TypedKeyNotFound(const Mark& mark_, const T& key_)
: KeyNotFound(mark_, key_), key(key_) {}
virtual ~TypedKeyNotFound() NOEXCEPT {}
~TypedKeyNotFound() YAML_CPP_NOEXCEPT override = default;
T key;
};
@ -198,10 +228,11 @@ inline TypedKeyNotFound<T> MakeTypedKeyNotFound(const Mark& mark,
class YAML_CPP_API InvalidNode : public RepresentationException {
public:
InvalidNode()
: RepresentationException(Mark::null_mark(), ErrorMsg::INVALID_NODE) {}
InvalidNode(const std::string& key)
: RepresentationException(Mark::null_mark(),
ErrorMsg::INVALID_NODE_WITH_KEY(key)) {}
InvalidNode(const InvalidNode&) = default;
virtual ~InvalidNode() NOEXCEPT;
~InvalidNode() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadConversion : public RepresentationException {
@ -209,7 +240,7 @@ class YAML_CPP_API BadConversion : public RepresentationException {
explicit BadConversion(const Mark& mark_)
: RepresentationException(mark_, ErrorMsg::BAD_CONVERSION) {}
BadConversion(const BadConversion&) = default;
virtual ~BadConversion() NOEXCEPT;
~BadConversion() YAML_CPP_NOEXCEPT override;
};
template <typename T>
@ -223,15 +254,16 @@ class YAML_CPP_API BadDereference : public RepresentationException {
BadDereference()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_DEREFERENCE) {}
BadDereference(const BadDereference&) = default;
virtual ~BadDereference() NOEXCEPT;
~BadDereference() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadSubscript : public RepresentationException {
public:
BadSubscript()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_SUBSCRIPT) {}
template <typename Key>
BadSubscript(const Mark& mark_, const Key& key)
: RepresentationException(mark_, ErrorMsg::BAD_SUBSCRIPT_WITH_KEY(key)) {}
BadSubscript(const BadSubscript&) = default;
virtual ~BadSubscript() NOEXCEPT;
~BadSubscript() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadPushback : public RepresentationException {
@ -239,7 +271,7 @@ class YAML_CPP_API BadPushback : public RepresentationException {
BadPushback()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_PUSHBACK) {}
BadPushback(const BadPushback&) = default;
virtual ~BadPushback() NOEXCEPT;
~BadPushback() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadInsert : public RepresentationException {
@ -247,7 +279,7 @@ class YAML_CPP_API BadInsert : public RepresentationException {
BadInsert()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_INSERT) {}
BadInsert(const BadInsert&) = default;
virtual ~BadInsert() NOEXCEPT;
~BadInsert() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API EmitterException : public Exception {
@ -255,15 +287,17 @@ class YAML_CPP_API EmitterException : public Exception {
EmitterException(const std::string& msg_)
: Exception(Mark::null_mark(), msg_) {}
EmitterException(const EmitterException&) = default;
virtual ~EmitterException() NOEXCEPT;
~EmitterException() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadFile : public Exception {
public:
BadFile() : Exception(Mark::null_mark(), ErrorMsg::BAD_FILE) {}
explicit BadFile(const std::string& filename)
: Exception(Mark::null_mark(),
std::string(ErrorMsg::BAD_FILE) + ": " + filename) {}
BadFile(const BadFile&) = default;
virtual ~BadFile() NOEXCEPT;
~BadFile() YAML_CPP_NOEXCEPT override;
};
}
} // namespace YAML
#endif // EXCEPTIONS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -8,10 +8,14 @@
#endif
#include <array>
#include <cmath>
#include <limits>
#include <list>
#include <map>
#include <unordered_map>
#include <sstream>
#include <type_traits>
#include <valarray>
#include <vector>
#include "yaml-cpp/binary.h"
@ -21,6 +25,7 @@
#include "yaml-cpp/node/type.h"
#include "yaml-cpp/null.h"
namespace YAML {
class Binary;
struct _Null;
@ -71,12 +76,17 @@ struct convert<std::string> {
// C-strings can only be encoded
template <>
struct convert<const char*> {
static Node encode(const char*& rhs) { return Node(rhs); }
static Node encode(const char* rhs) { return Node(rhs); }
};
template <>
struct convert<char*> {
static Node encode(const char* rhs) { return Node(rhs); }
};
template <std::size_t N>
struct convert<const char[N]> {
static Node encode(const char(&rhs)[N]) { return Node(rhs); }
struct convert<char[N]> {
static Node encode(const char* rhs) { return Node(rhs); }
};
template <>
@ -88,42 +98,98 @@ struct convert<_Null> {
}
};
#define YAML_DEFINE_CONVERT_STREAMABLE(type, negative_op) \
template <> \
struct convert<type> { \
static Node encode(const type& rhs) { \
std::stringstream stream; \
stream.precision(std::numeric_limits<type>::digits10 + 1); \
stream << rhs; \
return Node(stream.str()); \
} \
\
static bool decode(const Node& node, type& rhs) { \
if (node.Type() != NodeType::Scalar) \
return false; \
const std::string& input = node.Scalar(); \
std::stringstream stream(input); \
stream.unsetf(std::ios::dec); \
if ((stream >> std::noskipws >> rhs) && (stream >> std::ws).eof()) \
return true; \
if (std::numeric_limits<type>::has_infinity) { \
if (conversion::IsInfinity(input)) { \
rhs = std::numeric_limits<type>::infinity(); \
return true; \
} else if (conversion::IsNegativeInfinity(input)) { \
rhs = negative_op std::numeric_limits<type>::infinity(); \
return true; \
} \
} \
\
if (std::numeric_limits<type>::has_quiet_NaN && \
conversion::IsNaN(input)) { \
rhs = std::numeric_limits<type>::quiet_NaN(); \
return true; \
} \
\
return false; \
} \
namespace conversion {
template <typename T>
typename std::enable_if< std::is_floating_point<T>::value, void>::type
inner_encode(const T& rhs, std::stringstream& stream){
if (std::isnan(rhs)) {
stream << ".nan";
} else if (std::isinf(rhs)) {
if (std::signbit(rhs)) {
stream << "-.inf";
} else {
stream << ".inf";
}
} else {
stream << rhs;
}
}
template <typename T>
typename std::enable_if<!std::is_floating_point<T>::value, void>::type
inner_encode(const T& rhs, std::stringstream& stream){
stream << rhs;
}
template <typename T>
typename std::enable_if<(std::is_same<T, unsigned char>::value ||
std::is_same<T, signed char>::value), bool>::type
ConvertStreamTo(std::stringstream& stream, T& rhs) {
int num;
if ((stream >> std::noskipws >> num) && (stream >> std::ws).eof()) {
if (num >= (std::numeric_limits<T>::min)() &&
num <= (std::numeric_limits<T>::max)()) {
rhs = static_cast<T>(num);
return true;
}
}
return false;
}
template <typename T>
typename std::enable_if<!(std::is_same<T, unsigned char>::value ||
std::is_same<T, signed char>::value), bool>::type
ConvertStreamTo(std::stringstream& stream, T& rhs) {
if ((stream >> std::noskipws >> rhs) && (stream >> std::ws).eof()) {
return true;
}
return false;
}
}
#define YAML_DEFINE_CONVERT_STREAMABLE(type, negative_op) \
template <> \
struct convert<type> { \
\
static Node encode(const type& rhs) { \
std::stringstream stream; \
stream.precision(std::numeric_limits<type>::max_digits10); \
conversion::inner_encode(rhs, stream); \
return Node(stream.str()); \
} \
\
static bool decode(const Node& node, type& rhs) { \
if (node.Type() != NodeType::Scalar) { \
return false; \
} \
const std::string& input = node.Scalar(); \
std::stringstream stream(input); \
stream.unsetf(std::ios::dec); \
if ((stream.peek() == '-') && std::is_unsigned<type>::value) { \
return false; \
} \
if (conversion::ConvertStreamTo(stream, rhs)) { \
return true; \
} \
if (std::numeric_limits<type>::has_infinity) { \
if (conversion::IsInfinity(input)) { \
rhs = std::numeric_limits<type>::infinity(); \
return true; \
} else if (conversion::IsNegativeInfinity(input)) { \
rhs = negative_op std::numeric_limits<type>::infinity(); \
return true; \
} \
} \
\
if (std::numeric_limits<type>::has_quiet_NaN) { \
if (conversion::IsNaN(input)) { \
rhs = std::numeric_limits<type>::quiet_NaN(); \
return true; \
} \
} \
\
return false; \
} \
}
#define YAML_DEFINE_CONVERT_STREAMABLE_SIGNED(type) \
@ -162,81 +228,104 @@ struct convert<bool> {
};
// std::map
template <typename K, typename V>
struct convert<std::map<K, V>> {
static Node encode(const std::map<K, V>& rhs) {
template <typename K, typename V, typename C, typename A>
struct convert<std::map<K, V, C, A>> {
static Node encode(const std::map<K, V, C, A>& rhs) {
Node node(NodeType::Map);
for (typename std::map<K, V>::const_iterator it = rhs.begin();
it != rhs.end(); ++it)
node.force_insert(it->first, it->second);
for (const auto& element : rhs)
node.force_insert(element.first, element.second);
return node;
}
static bool decode(const Node& node, std::map<K, V>& rhs) {
static bool decode(const Node& node, std::map<K, V, C, A>& rhs) {
if (!node.IsMap())
return false;
rhs.clear();
for (const_iterator it = node.begin(); it != node.end(); ++it)
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[it->first.template as<K>()] = it->second.template as<V>();
rhs[element.first.template as<K>()] = element.second.template as<V>();
#else
rhs[it->first.as<K>()] = it->second.as<V>();
rhs[element.first.as<K>()] = element.second.as<V>();
#endif
return true;
}
};
// std::unordered_map
template <typename K, typename V, typename H, typename P, typename A>
struct convert<std::unordered_map<K, V, H, P, A>> {
static Node encode(const std::unordered_map<K, V, H, P, A>& rhs) {
Node node(NodeType::Map);
for (const auto& element : rhs)
node.force_insert(element.first, element.second);
return node;
}
static bool decode(const Node& node, std::unordered_map<K, V, H, P, A>& rhs) {
if (!node.IsMap())
return false;
rhs.clear();
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[element.first.template as<K>()] = element.second.template as<V>();
#else
rhs[element.first.as<K>()] = element.second.as<V>();
#endif
return true;
}
};
// std::vector
template <typename T>
struct convert<std::vector<T>> {
static Node encode(const std::vector<T>& rhs) {
template <typename T, typename A>
struct convert<std::vector<T, A>> {
static Node encode(const std::vector<T, A>& rhs) {
Node node(NodeType::Sequence);
for (typename std::vector<T>::const_iterator it = rhs.begin();
it != rhs.end(); ++it)
node.push_back(*it);
for (const auto& element : rhs)
node.push_back(element);
return node;
}
static bool decode(const Node& node, std::vector<T>& rhs) {
static bool decode(const Node& node, std::vector<T, A>& rhs) {
if (!node.IsSequence())
return false;
rhs.clear();
for (const_iterator it = node.begin(); it != node.end(); ++it)
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs.push_back(it->template as<T>());
rhs.push_back(element.template as<T>());
#else
rhs.push_back(it->as<T>());
rhs.push_back(element.as<T>());
#endif
return true;
}
};
// std::list
template <typename T>
struct convert<std::list<T>> {
static Node encode(const std::list<T>& rhs) {
template <typename T, typename A>
struct convert<std::list<T,A>> {
static Node encode(const std::list<T,A>& rhs) {
Node node(NodeType::Sequence);
for (typename std::list<T>::const_iterator it = rhs.begin();
it != rhs.end(); ++it)
node.push_back(*it);
for (const auto& element : rhs)
node.push_back(element);
return node;
}
static bool decode(const Node& node, std::list<T>& rhs) {
static bool decode(const Node& node, std::list<T,A>& rhs) {
if (!node.IsSequence())
return false;
rhs.clear();
for (const_iterator it = node.begin(); it != node.end(); ++it)
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs.push_back(it->template as<T>());
rhs.push_back(element.template as<T>());
#else
rhs.push_back(it->as<T>());
rhs.push_back(element.as<T>());
#endif
return true;
}
@ -275,6 +364,37 @@ struct convert<std::array<T, N>> {
}
};
// std::valarray
template <typename T>
struct convert<std::valarray<T>> {
static Node encode(const std::valarray<T>& rhs) {
Node node(NodeType::Sequence);
for (const auto& element : rhs) {
node.push_back(element);
}
return node;
}
static bool decode(const Node& node, std::valarray<T>& rhs) {
if (!node.IsSequence()) {
return false;
}
rhs.resize(node.size());
for (auto i = 0u; i < node.size(); ++i) {
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[i] = node[i].template as<T>();
#else
rhs[i] = node[i].as<T>();
#endif
}
return true;
}
};
// std::pair
template <typename T, typename U>
struct convert<std::pair<T, U>> {

View File

@ -9,6 +9,8 @@
#include "yaml-cpp/node/detail/node.h"
#include "yaml-cpp/node/detail/node_data.h"
#include <algorithm>
#include <type_traits>
namespace YAML {
@ -17,7 +19,7 @@ template <typename Key, typename Enable = void>
struct get_idx {
static node* get(const std::vector<node*>& /* sequence */,
const Key& /* key */, shared_memory_holder /* pMemory */) {
return 0;
return nullptr;
}
};
@ -27,13 +29,13 @@ struct get_idx<Key,
!std::is_same<Key, bool>::value>::type> {
static node* get(const std::vector<node*>& sequence, const Key& key,
shared_memory_holder /* pMemory */) {
return key < sequence.size() ? sequence[key] : 0;
return key < sequence.size() ? sequence[key] : nullptr;
}
static node* get(std::vector<node*>& sequence, const Key& key,
shared_memory_holder pMemory) {
if (key > sequence.size() || (key > 0 && !sequence[key-1]->is_defined()))
return 0;
if (key > sequence.size() || (key > 0 && !sequence[key - 1]->is_defined()))
return nullptr;
if (key == sequence.size())
sequence.push_back(&pMemory->create_node());
return sequence[key];
@ -46,13 +48,51 @@ struct get_idx<Key, typename std::enable_if<std::is_signed<Key>::value>::type> {
shared_memory_holder pMemory) {
return key >= 0 ? get_idx<std::size_t>::get(
sequence, static_cast<std::size_t>(key), pMemory)
: 0;
: nullptr;
}
static node* get(std::vector<node*>& sequence, const Key& key,
shared_memory_holder pMemory) {
return key >= 0 ? get_idx<std::size_t>::get(
sequence, static_cast<std::size_t>(key), pMemory)
: 0;
: nullptr;
}
};
template <typename Key, typename Enable = void>
struct remove_idx {
static bool remove(std::vector<node*>&, const Key&, std::size_t&) {
return false;
}
};
template <typename Key>
struct remove_idx<
Key, typename std::enable_if<std::is_unsigned<Key>::value &&
!std::is_same<Key, bool>::value>::type> {
static bool remove(std::vector<node*>& sequence, const Key& key,
std::size_t& seqSize) {
if (key >= sequence.size()) {
return false;
} else {
sequence.erase(sequence.begin() + key);
if (seqSize > key) {
--seqSize;
}
return true;
}
}
};
template <typename Key>
struct remove_idx<Key,
typename std::enable_if<std::is_signed<Key>::value>::type> {
static bool remove(std::vector<node*>& sequence, const Key& key,
std::size_t& seqSize) {
return key >= 0 ? remove_idx<std::size_t>::remove(
sequence, static_cast<std::size_t>(key), seqSize)
: false;
}
};
@ -66,7 +106,11 @@ inline bool node::equals(const T& rhs, shared_memory_holder pMemory) {
}
inline bool node::equals(const char* rhs, shared_memory_holder pMemory) {
return equals<std::string>(rhs, pMemory);
std::string lhs;
if (convert<std::string>::decode(Node(*this, std::move(pMemory)), lhs)) {
return lhs == rhs;
}
return false;
}
// indexing
@ -78,22 +122,20 @@ inline node* node_data::get(const Key& key,
break;
case NodeType::Undefined:
case NodeType::Null:
return NULL;
return nullptr;
case NodeType::Sequence:
if (node* pNode = get_idx<Key>::get(m_sequence, key, pMemory))
return pNode;
return NULL;
return nullptr;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->equals(key, pMemory)) {
return it->second;
}
}
auto it = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) {
return m.first->equals(key, pMemory);
});
return NULL;
return it != m_map.end() ? it->second : nullptr;
}
template <typename Key>
@ -112,13 +154,15 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
convert_to_map(pMemory);
break;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->equals(key, pMemory)) {
return *it->second;
}
auto it = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) {
return m.first->equals(key, pMemory);
});
if (it != m_map.end()) {
return *it->second;
}
node& k = convert_to_node(key, pMemory);
@ -129,20 +173,26 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
template <typename Key>
inline bool node_data::remove(const Key& key, shared_memory_holder pMemory) {
if (m_type != NodeType::Map)
return false;
for (kv_pairs::iterator it = m_undefinedPairs.begin();
it != m_undefinedPairs.end();) {
kv_pairs::iterator jt = std::next(it);
if (it->first->equals(key, pMemory))
m_undefinedPairs.erase(it);
it = jt;
if (m_type == NodeType::Sequence) {
return remove_idx<Key>::remove(m_sequence, key, m_seqSize);
}
for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->equals(key, pMemory)) {
m_map.erase(it);
if (m_type == NodeType::Map) {
kv_pairs::iterator it = m_undefinedPairs.begin();
while (it != m_undefinedPairs.end()) {
kv_pairs::iterator jt = std::next(it);
if (it->first->equals(key, pMemory)) {
m_undefinedPairs.erase(it);
}
it = jt;
}
auto iter = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) {
return m.first->equals(key, pMemory);
});
if (iter != m_map.end()) {
m_map.erase(iter);
return true;
}
}

View File

@ -8,24 +8,25 @@
#endif
#include "yaml-cpp/dll.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/detail/node_iterator.h"
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/ptr.h"
#include <cstddef>
#include <iterator>
namespace YAML {
namespace detail {
struct iterator_value;
template <typename V>
class iterator_base : public std::iterator<std::forward_iterator_tag, V,
std::ptrdiff_t, V*, V> {
class iterator_base {
private:
template <typename>
friend class iterator_base;
struct enabler {};
typedef node_iterator base_type;
using base_type = node_iterator;
struct proxy {
explicit proxy(const V& x) : m_ref(x) {}
@ -36,7 +37,11 @@ class iterator_base : public std::iterator<std::forward_iterator_tag, V,
};
public:
typedef typename iterator_base::value_type value_type;
using iterator_category = std::forward_iterator_tag;
using value_type = V;
using difference_type = std::ptrdiff_t;
using pointer = V*;
using reference = V;
public:
iterator_base() : m_iterator(), m_pMemory() {}
@ -85,7 +90,7 @@ class iterator_base : public std::iterator<std::forward_iterator_tag, V,
base_type m_iterator;
shared_memory_holder m_pMemory;
};
}
}
} // namespace detail
} // namespace YAML
#endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -20,8 +20,8 @@ template <typename V>
class iterator_base;
}
typedef detail::iterator_base<detail::iterator_value> iterator;
typedef detail::iterator_base<const detail::iterator_value> const_iterator;
using iterator = detail::iterator_base<detail::iterator_value>;
using const_iterator = detail::iterator_base<const detail::iterator_value>;
}
#endif // VALUE_DETAIL_ITERATOR_FWD_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -22,11 +22,12 @@ namespace YAML {
namespace detail {
class YAML_CPP_API memory {
public:
memory() : m_nodes{} {}
node& create_node();
void merge(const memory& rhs);
private:
typedef std::set<shared_node> Nodes;
using Nodes = std::set<shared_node>;
Nodes m_nodes;
};
@ -40,7 +41,7 @@ class YAML_CPP_API memory_holder {
private:
shared_memory m_pMemory;
};
}
}
} // namespace detail
} // namespace YAML
#endif // VALUE_DETAIL_MEMORY_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -7,18 +7,24 @@
#pragma once
#endif
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/dll.h"
#include "yaml-cpp/node/type.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/node/detail/node_ref.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/type.h"
#include <set>
#include <atomic>
namespace YAML {
namespace detail {
class node {
private:
struct less {
bool operator ()(const node* l, const node* r) const {return l->m_index < r->m_index;}
};
public:
node() : m_pRef(new node_ref) {}
node() : m_pRef(new node_ref), m_dependencies{}, m_index{} {}
node(const node&) = delete;
node& operator=(const node&) = delete;
@ -42,9 +48,8 @@ class node {
return;
m_pRef->mark_defined();
for (nodes::iterator it = m_dependencies.begin();
it != m_dependencies.end(); ++it)
(*it)->mark_defined();
for (node* dependency : m_dependencies)
dependency->mark_defined();
m_dependencies.clear();
}
@ -109,6 +114,7 @@ class node {
void push_back(node& input, shared_memory_holder pMemory) {
m_pRef->push_back(input, pMemory);
input.add_dependency(*this);
m_index = m_amount.fetch_add(1);
}
void insert(node& key, node& value, shared_memory_holder pMemory) {
m_pRef->insert(key, value, pMemory);
@ -120,7 +126,7 @@ class node {
template <typename Key>
node* get(const Key& key, shared_memory_holder pMemory) const {
// NOTE: this returns a non-const node so that the top-level Node can wrap
// it, and returns a pointer so that it can be NULL (if there is no such
// it, and returns a pointer so that it can be nullptr (if there is no such
// key).
return static_cast<const node_ref&>(*m_pRef).get(key, pMemory);
}
@ -137,7 +143,7 @@ class node {
node* get(node& key, shared_memory_holder pMemory) const {
// NOTE: this returns a non-const node so that the top-level Node can wrap
// it, and returns a pointer so that it can be NULL (if there is no such
// it, and returns a pointer so that it can be nullptr (if there is no such
// key).
return static_cast<const node_ref&>(*m_pRef).get(key, pMemory);
}
@ -160,10 +166,12 @@ class node {
private:
shared_node_ref m_pRef;
typedef std::set<node*> nodes;
using nodes = std::set<node*, less>;
nodes m_dependencies;
size_t m_index;
static YAML_CPP_API std::atomic<size_t> m_amount;
};
}
}
} // namespace detail
} // namespace YAML
#endif // NODE_DETAIL_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -60,8 +60,8 @@ class YAML_CPP_API node_data {
node_iterator end();
// sequence
void push_back(node& node, shared_memory_holder pMemory);
void insert(node& key, node& value, shared_memory_holder pMemory);
void push_back(node& node, const shared_memory_holder& pMemory);
void insert(node& key, node& value, const shared_memory_holder& pMemory);
// indexing
template <typename Key>
@ -71,9 +71,9 @@ class YAML_CPP_API node_data {
template <typename Key>
bool remove(const Key& key, shared_memory_holder pMemory);
node* get(node& key, shared_memory_holder pMemory) const;
node& get(node& key, shared_memory_holder pMemory);
bool remove(node& key, shared_memory_holder pMemory);
node* get(node& key, const shared_memory_holder& pMemory) const;
node& get(node& key, const shared_memory_holder& pMemory);
bool remove(node& key, const shared_memory_holder& pMemory);
// map
template <typename Key, typename Value>
@ -81,7 +81,7 @@ class YAML_CPP_API node_data {
shared_memory_holder pMemory);
public:
static std::string empty_scalar;
static const std::string& empty_scalar();
private:
void compute_seq_size() const;
@ -91,8 +91,8 @@ class YAML_CPP_API node_data {
void reset_map();
void insert_map_pair(node& key, node& value);
void convert_to_map(shared_memory_holder pMemory);
void convert_sequence_to_map(shared_memory_holder pMemory);
void convert_to_map(const shared_memory_holder& pMemory);
void convert_sequence_to_map(const shared_memory_holder& pMemory);
template <typename T>
static node& convert_to_node(const T& rhs, shared_memory_holder pMemory);
@ -108,17 +108,17 @@ class YAML_CPP_API node_data {
std::string m_scalar;
// sequence
typedef std::vector<node*> node_seq;
using node_seq = std::vector<node *>;
node_seq m_sequence;
mutable std::size_t m_seqSize;
// map
typedef std::vector<std::pair<node*, node*>> node_map;
using node_map = std::vector<std::pair<node*, node*>>;
node_map m_map;
typedef std::pair<node*, node*> kv_pair;
typedef std::list<kv_pair> kv_pairs;
using kv_pair = std::pair<node*, node*>;
using kv_pairs = std::list<kv_pair>;
mutable kv_pairs m_undefinedPairs;
};
}

View File

@ -19,16 +19,16 @@
namespace YAML {
namespace detail {
struct iterator_type {
enum value { None, Sequence, Map };
enum value { NoneType, Sequence, Map };
};
template <typename V>
struct node_iterator_value : public std::pair<V*, V*> {
typedef std::pair<V*, V*> kv;
using kv = std::pair<V*, V*>;
node_iterator_value() : kv(), pNode(0) {}
node_iterator_value() : kv(), pNode(nullptr) {}
explicit node_iterator_value(V& rhs) : kv(), pNode(&rhs) {}
explicit node_iterator_value(V& key, V& value) : kv(&key, &value), pNode(0) {}
explicit node_iterator_value(V& key, V& value) : kv(&key, &value), pNode(nullptr) {}
V& operator*() const { return *pNode; }
V& operator->() const { return *pNode; }
@ -36,26 +36,23 @@ struct node_iterator_value : public std::pair<V*, V*> {
V* pNode;
};
typedef std::vector<node*> node_seq;
typedef std::vector<std::pair<node*, node*>> node_map;
using node_seq = std::vector<node *>;
using node_map = std::vector<std::pair<node*, node*>>;
template <typename V>
struct node_iterator_type {
typedef node_seq::iterator seq;
typedef node_map::iterator map;
using seq = node_seq::iterator;
using map = node_map::iterator;
};
template <typename V>
struct node_iterator_type<const V> {
typedef node_seq::const_iterator seq;
typedef node_map::const_iterator map;
using seq = node_seq::const_iterator;
using map = node_map::const_iterator;
};
template <typename V>
class node_iterator_base
: public std::iterator<std::forward_iterator_tag, node_iterator_value<V>,
std::ptrdiff_t, node_iterator_value<V>*,
node_iterator_value<V>> {
class node_iterator_base {
private:
struct enabler {};
@ -68,12 +65,16 @@ class node_iterator_base
};
public:
typedef typename node_iterator_type<V>::seq SeqIter;
typedef typename node_iterator_type<V>::map MapIter;
typedef node_iterator_value<V> value_type;
using iterator_category = std::forward_iterator_tag;
using value_type = node_iterator_value<V>;
using difference_type = std::ptrdiff_t;
using pointer = node_iterator_value<V>*;
using reference = node_iterator_value<V>;
using SeqIter = typename node_iterator_type<V>::seq;
using MapIter = typename node_iterator_type<V>::map;
node_iterator_base()
: m_type(iterator_type::None), m_seqIt(), m_mapIt(), m_mapEnd() {}
: m_type(iterator_type::NoneType), m_seqIt(), m_mapIt(), m_mapEnd() {}
explicit node_iterator_base(SeqIter seqIt)
: m_type(iterator_type::Sequence),
m_seqIt(seqIt),
@ -105,7 +106,7 @@ class node_iterator_base
return false;
switch (m_type) {
case iterator_type::None:
case iterator_type::NoneType:
return true;
case iterator_type::Sequence:
return m_seqIt == rhs.m_seqIt;
@ -122,7 +123,7 @@ class node_iterator_base
node_iterator_base<V>& operator++() {
switch (m_type) {
case iterator_type::None:
case iterator_type::NoneType:
break;
case iterator_type::Sequence:
++m_seqIt;
@ -143,7 +144,7 @@ class node_iterator_base
value_type operator*() const {
switch (m_type) {
case iterator_type::None:
case iterator_type::NoneType:
return value_type();
case iterator_type::Sequence:
return value_type(**m_seqIt);
@ -172,8 +173,8 @@ class node_iterator_base
MapIter m_mapIt, m_mapEnd;
};
typedef node_iterator_base<node> node_iterator;
typedef node_iterator_base<const node> const_node_iterator;
using node_iterator = node_iterator_base<node>;
using const_node_iterator = node_iterator_base<const node>;
}
}

View File

@ -7,18 +7,21 @@
#pragma once
#endif
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/exceptions.h"
#include "yaml-cpp/node/detail/memory.h"
#include "yaml-cpp/node/detail/node.h"
#include "yaml-cpp/exceptions.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/node/node.h"
#include <sstream>
#include <string>
namespace YAML {
inline Node::Node() : m_isValid(true), m_pNode(NULL) {}
inline Node::Node()
: m_isValid(true), m_invalidKey{}, m_pMemory(nullptr), m_pNode(nullptr) {}
inline Node::Node(NodeType::value type)
: m_isValid(true),
m_invalidKey{},
m_pMemory(new detail::memory_holder),
m_pNode(&m_pMemory->create_node()) {
m_pNode->set_type(type);
@ -27,6 +30,7 @@ inline Node::Node(NodeType::value type)
template <typename T>
inline Node::Node(const T& rhs)
: m_isValid(true),
m_invalidKey{},
m_pMemory(new detail::memory_holder),
m_pNode(&m_pMemory->create_node()) {
Assign(rhs);
@ -34,24 +38,26 @@ inline Node::Node(const T& rhs)
inline Node::Node(const detail::iterator_value& rhs)
: m_isValid(rhs.m_isValid),
m_invalidKey(rhs.m_invalidKey),
m_pMemory(rhs.m_pMemory),
m_pNode(rhs.m_pNode) {}
inline Node::Node(const Node& rhs)
: m_isValid(rhs.m_isValid),
m_pMemory(rhs.m_pMemory),
m_pNode(rhs.m_pNode) {}
inline Node::Node(const Node&) = default;
inline Node::Node(Zombie) : m_isValid(false), m_pNode(NULL) {}
inline Node::Node(Zombie)
: m_isValid(false), m_invalidKey{}, m_pMemory{}, m_pNode(nullptr) {}
inline Node::Node(Zombie, const std::string& key)
: m_isValid(false), m_invalidKey(key), m_pMemory{}, m_pNode(nullptr) {}
inline Node::Node(detail::node& node, detail::shared_memory_holder pMemory)
: m_isValid(true), m_pMemory(pMemory), m_pNode(&node) {}
: m_isValid(true), m_invalidKey{}, m_pMemory(pMemory), m_pNode(&node) {}
inline Node::~Node() {}
inline Node::~Node() = default;
inline void Node::EnsureNodeExists() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
if (!m_pNode) {
m_pMemory.reset(new detail::memory_holder);
m_pNode = &m_pMemory->create_node();
@ -68,14 +74,14 @@ inline bool Node::IsDefined() const {
inline Mark Node::Mark() const {
if (!m_isValid) {
throw InvalidNode();
throw InvalidNode(m_invalidKey);
}
return m_pNode ? m_pNode->mark() : Mark::null_mark();
}
inline NodeType::value Node::Type() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->type() : NodeType::Null;
}
@ -104,6 +110,8 @@ struct as_if<std::string, S> {
const Node& node;
std::string operator()(const S& fallback) const {
if (node.Type() == NodeType::Null)
return "null";
if (node.Type() != NodeType::Scalar)
return fallback;
return node.Scalar();
@ -132,6 +140,8 @@ struct as_if<std::string, void> {
const Node& node;
std::string operator()() const {
if (node.Type() == NodeType::Null)
return "null";
if (node.Type() != NodeType::Scalar)
throw TypedBadConversion<std::string>(node.Mark());
return node.Scalar();
@ -142,7 +152,7 @@ struct as_if<std::string, void> {
template <typename T>
inline T Node::as() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return as_if<T, void>(*this)();
}
@ -155,32 +165,28 @@ inline T Node::as(const S& fallback) const {
inline const std::string& Node::Scalar() const {
if (!m_isValid)
throw InvalidNode();
return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar;
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar();
}
inline const std::string& Node::Tag() const {
if (!m_isValid)
throw InvalidNode();
return m_pNode ? m_pNode->tag() : detail::node_data::empty_scalar;
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->tag() : detail::node_data::empty_scalar();
}
inline void Node::SetTag(const std::string& tag) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_tag(tag);
}
inline EmitterStyle::value Node::Style() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->style() : EmitterStyle::Default;
}
inline void Node::SetStyle(EmitterStyle::value style) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_style(style);
}
@ -188,7 +194,7 @@ inline void Node::SetStyle(EmitterStyle::value style) {
// assignment
inline bool Node::is(const Node& rhs) const {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
if (!m_pNode || !rhs.m_pNode)
return false;
return m_pNode->is(*rhs.m_pNode);
@ -196,15 +202,20 @@ inline bool Node::is(const Node& rhs) const {
template <typename T>
inline Node& Node::operator=(const T& rhs) {
if (!m_isValid)
throw InvalidNode();
Assign(rhs);
return *this;
}
inline Node& Node::operator=(const Node& rhs) {
if (is(rhs))
return *this;
AssignNode(rhs);
return *this;
}
inline void Node::reset(const YAML::Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
m_pMemory = rhs.m_pMemory;
m_pNode = rhs.m_pNode;
}
@ -212,44 +223,27 @@ inline void Node::reset(const YAML::Node& rhs) {
template <typename T>
inline void Node::Assign(const T& rhs) {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
AssignData(convert<T>::encode(rhs));
}
template <>
inline void Node::Assign(const std::string& rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_scalar(rhs);
}
inline void Node::Assign(const char* rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_scalar(rhs);
}
inline void Node::Assign(char* rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_scalar(rhs);
}
inline Node& Node::operator=(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
if (is(rhs))
return *this;
AssignNode(rhs);
return *this;
}
inline void Node::AssignData(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
EnsureNodeExists();
rhs.EnsureNodeExists();
@ -258,8 +252,8 @@ inline void Node::AssignData(const Node& rhs) {
}
inline void Node::AssignNode(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
if (!m_isValid)
throw InvalidNode(m_invalidKey);
rhs.EnsureNodeExists();
if (!m_pNode) {
@ -276,7 +270,7 @@ inline void Node::AssignNode(const Node& rhs) {
// size/iterator
inline std::size_t Node::size() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->size() : 0;
}
@ -309,13 +303,11 @@ inline iterator Node::end() {
template <typename T>
inline void Node::push_back(const T& rhs) {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
push_back(Node(rhs));
}
inline void Node::push_back(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
EnsureNodeExists();
rhs.EnsureNodeExists();
@ -323,99 +315,49 @@ inline void Node::push_back(const Node& rhs) {
m_pMemory->merge(*rhs.m_pMemory);
}
// helpers for indexing
namespace detail {
template <typename T>
struct to_value_t {
explicit to_value_t(const T& t_) : t(t_) {}
const T& t;
typedef const T& return_type;
const T& operator()() const { return t; }
};
template <>
struct to_value_t<const char*> {
explicit to_value_t(const char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
template <>
struct to_value_t<char*> {
explicit to_value_t(char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
template <std::size_t N>
struct to_value_t<char[N]> {
explicit to_value_t(const char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
// converts C-strings to std::strings so they can be copied
template <typename T>
inline typename to_value_t<T>::return_type to_value(const T& t) {
return to_value_t<T>(t)();
}
template<typename Key>
std::string key_to_string(const Key& key) {
return streamable_to_string<Key, is_streamable<std::stringstream, Key>::value>().impl(key);
}
// indexing
template <typename Key>
inline const Node Node::operator[](const Key& key) const {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
detail::node* value = static_cast<const detail::node&>(*m_pNode)
.get(detail::to_value(key), m_pMemory);
detail::node* value =
static_cast<const detail::node&>(*m_pNode).get(key, m_pMemory);
if (!value) {
return Node(ZombieNode);
return Node(ZombieNode, key_to_string(key));
}
return Node(*value, m_pMemory);
}
template <typename Key>
inline Node Node::operator[](const Key& key) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
detail::node& value = m_pNode->get(detail::to_value(key), m_pMemory);
detail::node& value = m_pNode->get(key, m_pMemory);
return Node(value, m_pMemory);
}
template <typename Key>
inline bool Node::remove(const Key& key) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
return m_pNode->remove(detail::to_value(key), m_pMemory);
return m_pNode->remove(key, m_pMemory);
}
inline const Node Node::operator[](const Node& key) const {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists();
key.EnsureNodeExists();
m_pMemory->merge(*key.m_pMemory);
detail::node* value =
static_cast<const detail::node&>(*m_pNode).get(*key.m_pNode, m_pMemory);
if (!value) {
return Node(ZombieNode);
return Node(ZombieNode, key_to_string(key));
}
return Node(*value, m_pMemory);
}
inline Node Node::operator[](const Node& key) {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists();
key.EnsureNodeExists();
m_pMemory->merge(*key.m_pMemory);
@ -424,8 +366,6 @@ inline Node Node::operator[](const Node& key) {
}
inline bool Node::remove(const Node& key) {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists();
key.EnsureNodeExists();
return m_pNode->remove(*key.m_pNode, m_pMemory);
@ -434,15 +374,12 @@ inline bool Node::remove(const Node& key) {
// map
template <typename Key, typename Value>
inline void Node::force_insert(const Key& key, const Value& value) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->force_insert(detail::to_value(key), detail::to_value(value),
m_pMemory);
m_pNode->force_insert(key, value, m_pMemory);
}
// free functions
inline bool operator==(const Node& lhs, const Node& rhs) { return lhs.is(rhs); }
}
} // namespace YAML
#endif // NODE_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -15,10 +15,13 @@
#include <utility>
#include <vector>
// Assert in place so gcc + libc++ combination properly builds
static_assert(std::is_constructible<YAML::Node, const YAML::Node&>::value, "Node must be copy constructable");
namespace YAML {
namespace detail {
struct iterator_value : public Node, std::pair<Node, Node> {
iterator_value() {}
iterator_value() = default;
explicit iterator_value(const Node& rhs)
: Node(rhs),
std::pair<Node, Node>(Node(Node::ZombieNode), Node(Node::ZombieNode)) {}

View File

@ -8,11 +8,11 @@
#endif
#include <stdexcept>
#include <string>
#include "yaml-cpp/dll.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/mark.h"
#include "yaml-cpp/node/detail/bool_type.h"
#include "yaml-cpp/node/detail/iterator_fwd.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/type.h"
@ -38,8 +38,8 @@ class YAML_CPP_API Node {
template <typename T, typename S>
friend struct as_if;
typedef YAML::iterator iterator;
typedef YAML::const_iterator const_iterator;
using iterator = YAML::iterator;
using const_iterator = YAML::const_iterator;
Node();
explicit Node(NodeType::value type);
@ -58,7 +58,7 @@ class YAML_CPP_API Node {
bool IsMap() const { return Type() == NodeType::Map; }
// bool conversions
YAML_CPP_OPERATOR_BOOL()
explicit operator bool() const { return IsDefined(); }
bool operator!() const { return !IsDefined(); }
// access
@ -116,6 +116,7 @@ class YAML_CPP_API Node {
private:
enum Zombie { ZombieNode };
explicit Node(Zombie);
explicit Node(Zombie, const std::string&);
explicit Node(detail::node& node, detail::shared_memory_holder pMemory);
void EnsureNodeExists() const;
@ -130,6 +131,8 @@ class YAML_CPP_API Node {
private:
bool m_isValid;
// String representation of invalid key, if the node is invalid.
std::string m_invalidKey;
mutable detail::shared_memory_holder m_pMemory;
mutable detail::node* m_pNode;
};

View File

@ -7,7 +7,6 @@
#pragma once
#endif
#include "yaml-cpp/dll.h"
#include <memory>
namespace YAML {
@ -18,11 +17,11 @@ class node_data;
class memory;
class memory_holder;
typedef std::shared_ptr<node> shared_node;
typedef std::shared_ptr<node_ref> shared_node_ref;
typedef std::shared_ptr<node_data> shared_node_data;
typedef std::shared_ptr<memory_holder> shared_memory_holder;
typedef std::shared_ptr<memory> shared_memory;
using shared_node = std::shared_ptr<node>;
using shared_node_ref = std::shared_ptr<node_ref>;
using shared_node_data = std::shared_ptr<node_data>;
using shared_memory_holder = std::shared_ptr<memory_holder>;
using shared_memory = std::shared_ptr<memory>;
}
}

View File

@ -0,0 +1,18 @@
#ifndef NOEXCEPT_H_768872DA_476C_11EA_88B8_90B11C0C0FF8
#define NOEXCEPT_H_768872DA_476C_11EA_88B8_90B11C0C0FF8
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
#endif
// This is here for compatibility with older versions of Visual Studio
// which don't support noexcept.
#if defined(_MSC_VER) && _MSC_VER < 1900
#define YAML_CPP_NOEXCEPT _NOEXCEPT
#else
#define YAML_CPP_NOEXCEPT noexcept
#endif
#endif

View File

@ -17,6 +17,10 @@ class YAML_CPP_API ostream_wrapper {
public:
ostream_wrapper();
explicit ostream_wrapper(std::ostream& stream);
ostream_wrapper(const ostream_wrapper&) = delete;
ostream_wrapper(ostream_wrapper&&) = delete;
ostream_wrapper& operator=(const ostream_wrapper&) = delete;
ostream_wrapper& operator=(ostream_wrapper&&) = delete;
~ostream_wrapper();
void write(const std::string& str);
@ -26,7 +30,7 @@ class YAML_CPP_API ostream_wrapper {
const char* str() const {
if (m_pStream) {
return 0;
return nullptr;
} else {
m_buffer[m_pos] = '\0';
return &m_buffer[0];
@ -52,7 +56,7 @@ class YAML_CPP_API ostream_wrapper {
template <std::size_t N>
inline ostream_wrapper& operator<<(ostream_wrapper& stream,
const char(&str)[N]) {
const char (&str)[N]) {
stream.write(str, N - 1);
return stream;
}
@ -67,6 +71,6 @@ inline ostream_wrapper& operator<<(ostream_wrapper& stream, char ch) {
stream.write(&ch, 1);
return stream;
}
}
} // namespace YAML
#endif // OSTREAM_WRAPPER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -11,7 +11,6 @@
#include <memory>
#include "yaml-cpp/dll.h"
#include "yaml-cpp/noncopyable.h"
namespace YAML {
class EventHandler;
@ -24,11 +23,16 @@ struct Token;
* A parser turns a stream of bytes into one stream of "events" per YAML
* document in the input stream.
*/
class YAML_CPP_API Parser : private noncopyable {
class YAML_CPP_API Parser {
public:
/** Constructs an empty parser (with no input. */
Parser();
Parser(const Parser&) = delete;
Parser(Parser&&) = delete;
Parser& operator=(const Parser&) = delete;
Parser& operator=(Parser&&) = delete;
/**
* Constructs a parser from the given input stream. The input stream must
* live as long as the parser.
@ -81,6 +85,6 @@ class YAML_CPP_API Parser : private noncopyable {
std::unique_ptr<Scanner> m_pScanner;
std::unique_ptr<Directives> m_pDirectives;
};
}
} // namespace YAML
#endif // PARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -16,8 +16,8 @@ namespace YAML {
template <typename Seq>
inline Emitter& EmitSeq(Emitter& emitter, const Seq& seq) {
emitter << BeginSeq;
for (typename Seq::const_iterator it = seq.begin(); it != seq.end(); ++it)
emitter << *it;
for (const auto& v : seq)
emitter << v;
emitter << EndSeq;
return emitter;
}
@ -39,10 +39,9 @@ inline Emitter& operator<<(Emitter& emitter, const std::set<T>& v) {
template <typename K, typename V>
inline Emitter& operator<<(Emitter& emitter, const std::map<K, V>& m) {
typedef typename std::map<K, V> map;
emitter << BeginMap;
for (typename map::const_iterator it = m.begin(); it != m.end(); ++it)
emitter << Key << it->first << Value << it->second;
for (const auto& v : m)
emitter << Key << v.first << Value << v.second;
emitter << EndMap;
return emitter;
}

View File

@ -7,6 +7,11 @@
#pragma once
#endif
#include <type_traits>
#include <utility>
#include <string>
#include <sstream>
namespace YAML {
template <typename>
struct is_numeric {
@ -79,7 +84,7 @@ struct is_numeric<long double> {
template <bool, class T = void>
struct enable_if_c {
typedef T type;
using type = T;
};
template <class T>
@ -90,7 +95,7 @@ struct enable_if : public enable_if_c<Cond::value, T> {};
template <bool, class T = void>
struct disable_if_c {
typedef T type;
using type = T;
};
template <class T>
@ -100,4 +105,31 @@ template <class Cond, class T = void>
struct disable_if : public disable_if_c<Cond::value, T> {};
}
template <typename S, typename T>
struct is_streamable {
template <typename StreamT, typename ValueT>
static auto test(int)
-> decltype(std::declval<StreamT&>() << std::declval<ValueT>(), std::true_type());
template <typename, typename>
static auto test(...) -> std::false_type;
static const bool value = decltype(test<S, T>(0))::value;
};
template<typename Key, bool Streamable>
struct streamable_to_string {
static std::string impl(const Key& key) {
std::stringstream ss;
ss << key;
return ss.str();
}
};
template<typename Key>
struct streamable_to_string<Key, false> {
static std::string impl(const Key&) {
return "";
}
};
#endif // TRAITS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -1,5 +1,7 @@
#include "yaml-cpp/binary.h"
#include <cctype>
namespace YAML {
static const char encoding[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@ -64,7 +66,7 @@ static const unsigned char decoding[] = {
};
std::vector<unsigned char> DecodeBase64(const std::string &input) {
typedef std::vector<unsigned char> ret_type;
using ret_type = std::vector<unsigned char>;
if (input.empty())
return ret_type();
@ -72,22 +74,27 @@ std::vector<unsigned char> DecodeBase64(const std::string &input) {
unsigned char *out = &ret[0];
unsigned value = 0;
for (std::size_t i = 0; i < input.size(); i++) {
unsigned char d = decoding[static_cast<unsigned>(input[i])];
for (std::size_t i = 0, cnt = 0; i < input.size(); i++) {
if (std::isspace(static_cast<unsigned char>(input[i]))) {
// skip newlines
continue;
}
unsigned char d = decoding[static_cast<unsigned char>(input[i])];
if (d == 255)
return ret_type();
value = (value << 6) | d;
if (i % 4 == 3) {
if (cnt % 4 == 3) {
*out++ = value >> 16;
if (i > 0 && input[i - 1] != '=')
*out++ = value >> 8;
if (input[i] != '=')
*out++ = value;
}
++cnt;
}
ret.resize(out - &ret[0]);
return ret;
}
}
} // namespace YAML

View File

@ -7,8 +7,8 @@
#pragma once
#endif
#include <stack>
#include <cassert>
#include <stack>
namespace YAML {
struct CollectionType {
@ -17,6 +17,7 @@ struct CollectionType {
class CollectionStack {
public:
CollectionStack() : collectionStack{} {}
CollectionType::value GetCurCollectionType() const {
if (collectionStack.empty())
return CollectionType::NoCollection;
@ -28,12 +29,13 @@ class CollectionStack {
}
void PopCollectionType(CollectionType::value type) {
assert(type == GetCurCollectionType());
(void)type;
collectionStack.pop();
}
private:
std::stack<CollectionType::value> collectionStack;
};
}
} // namespace YAML
#endif // COLLECTIONSTACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -10,8 +10,7 @@ void* BuildGraphOfNextDocument(Parser& parser,
GraphBuilderAdapter eventHandler(graphBuilder);
if (parser.HandleNextDocument(eventHandler)) {
return eventHandler.RootNode();
} else {
return NULL;
}
return nullptr;
}
}
} // namespace YAML

View File

@ -49,7 +49,7 @@ void GraphBuilderAdapter::OnMapStart(const Mark &mark, const std::string &tag,
EmitterStyle::value /* style */) {
void *pNode = m_builder.NewMap(mark, tag, GetCurrentParent());
m_containers.push(ContainerFrame(pNode, m_pKeyNode));
m_pKeyNode = NULL;
m_pKeyNode = nullptr;
RegisterAnchor(anchor, pNode);
}
@ -62,7 +62,7 @@ void GraphBuilderAdapter::OnMapEnd() {
void *GraphBuilderAdapter::GetCurrentParent() const {
if (m_containers.empty()) {
return NULL;
return nullptr;
}
return m_containers.top().pContainer;
}
@ -83,7 +83,7 @@ void GraphBuilderAdapter::DispositionNode(void *pNode) {
if (m_containers.top().isMap()) {
if (m_pKeyNode) {
m_builder.AssignInMap(pContainer, m_pKeyNode, pNode);
m_pKeyNode = NULL;
m_pKeyNode = nullptr;
} else {
m_pKeyNode = pNode;
}
@ -91,4 +91,4 @@ void GraphBuilderAdapter::DispositionNode(void *pNode) {
m_builder.AppendToSequence(pContainer, pNode);
}
}
}
} // namespace YAML

View File

@ -13,7 +13,6 @@
#include "yaml-cpp/anchor.h"
#include "yaml-cpp/contrib/anchordict.h"
#include "yaml-cpp/contrib/graphbuilder.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/eventhandler.h"
@ -26,7 +25,15 @@ namespace YAML {
class GraphBuilderAdapter : public EventHandler {
public:
GraphBuilderAdapter(GraphBuilderInterface& builder)
: m_builder(builder), m_pRootNode(NULL), m_pKeyNode(NULL) {}
: m_builder(builder),
m_containers{},
m_anchors{},
m_pRootNode(nullptr),
m_pKeyNode(nullptr) {}
GraphBuilderAdapter(const GraphBuilderAdapter&) = delete;
GraphBuilderAdapter(GraphBuilderAdapter&&) = delete;
GraphBuilderAdapter& operator=(const GraphBuilderAdapter&) = delete;
GraphBuilderAdapter& operator=(GraphBuilderAdapter&&) = delete;
virtual void OnDocumentStart(const Mark& mark) { (void)mark; }
virtual void OnDocumentEnd() {}
@ -50,8 +57,8 @@ class GraphBuilderAdapter : public EventHandler {
struct ContainerFrame {
ContainerFrame(void* pSequence)
: pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {}
ContainerFrame(void* pMap, void* pPrevKeyNode_)
: pContainer(pMap), pPrevKeyNode(pPrevKeyNode_) {}
ContainerFrame(void* pMap, void* pPreviousKeyNode)
: pContainer(pMap), pPrevKeyNode(pPreviousKeyNode) {}
void* pContainer;
void* pPrevKeyNode;
@ -74,6 +81,6 @@ class GraphBuilderAdapter : public EventHandler {
void RegisterAnchor(anchor_t anchor, void* pNode);
void DispositionNode(void* pNode);
};
}
} // namespace YAML
#endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- MSVC Debugger visualization hints for YAML::Node and YAML::detail::node -->
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="YAML::Node">
<DisplayString Condition="!m_isValid">{{invalid}}</DisplayString>
<DisplayString Condition="!m_pNode">{{pNode==nullptr}}</DisplayString>
<DisplayString>{{ {*m_pNode} }}</DisplayString>
<Expand>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar" Name="scalar">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_scalar</Item>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence" Name="sequence">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_sequence</Item>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map" Name="map">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_map</Item>
<Item Name="[details]" >m_pNode->m_pRef._Ptr->m_pData._Ptr</Item>
</Expand>
</Type>
<Type Name="YAML::detail::node">
<DisplayString Condition="!m_pRef._Ptr">{{node:pRef==nullptr}}</DisplayString>
<DisplayString Condition="!m_pRef._Ptr->m_pData._Ptr">{{node:pRef->pData==nullptr}}</DisplayString>
<DisplayString Condition="!m_pRef._Ptr->m_pData._Ptr->m_isDefined">{{undefined}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar">{{{m_pRef._Ptr->m_pData._Ptr->m_scalar}}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map">{{ Map {m_pRef._Ptr->m_pData._Ptr->m_map}}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence">{{ Seq {m_pRef._Ptr->m_pData._Ptr->m_sequence}}}</DisplayString>
<DisplayString>{{{m_pRef._Ptr->m_pData._Ptr->m_type}}}</DisplayString>
<Expand>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar" Name="scalar">m_pRef._Ptr->m_pData._Ptr->m_scalar</Item>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence" Name="sequence">m_pRef._Ptr->m_pData._Ptr->m_sequence</Item>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map" Name="map">m_pRef._Ptr->m_pData._Ptr->m_map</Item>
<Item Name="[details]" >m_pRef._Ptr->m_pData._Ptr</Item>
</Expand>
</Type>
</AutoVisualizer>

View File

@ -0,0 +1,9 @@
# MSVC debugger visualizer for YAML::Node
## How to use
Add yaml-cpp.natvis to your Visual C++ project like any other source file. It will be included in the debug information, and improve debugger display on YAML::Node and contained types.
## Compatibility and Troubleshooting
This has been tested for MSVC 2017. It is expected to be compatible with VS 2015 and VS 2019. If you have any problems, you can open an issue here: https://github.com/peterchen-cp/yaml-cpp-natvis

View File

@ -16,11 +16,7 @@ std::string tolower(const std::string& str) {
template <typename T>
bool IsEntirely(const std::string& str, T func) {
for (std::size_t i = 0; i < str.size(); i++)
if (!func(str[i]))
return false;
return true;
return std::all_of(str.begin(), str.end(), [=](char ch) { return func(ch); });
}
// IsFlexibleCase
@ -39,7 +35,7 @@ bool IsFlexibleCase(const std::string& str) {
std::string rest = str.substr(1);
return firstcaps && (IsEntirely(rest, IsLower) || IsEntirely(rest, IsUpper));
}
}
} // namespace
namespace YAML {
bool convert<bool>::decode(const Node& node, bool& rhs) {
@ -52,19 +48,22 @@ bool convert<bool>::decode(const Node& node, bool& rhs) {
static const struct {
std::string truename, falsename;
} names[] = {
{"y", "n"}, {"yes", "no"}, {"true", "false"}, {"on", "off"},
{"y", "n"},
{"yes", "no"},
{"true", "false"},
{"on", "off"},
};
if (!IsFlexibleCase(node.Scalar()))
return false;
for (unsigned i = 0; i < sizeof(names) / sizeof(names[0]); i++) {
if (names[i].truename == tolower(node.Scalar())) {
for (const auto& name : names) {
if (name.truename == tolower(node.Scalar())) {
rhs = true;
return true;
}
if (names[i].falsename == tolower(node.Scalar())) {
if (name.falsename == tolower(node.Scalar())) {
rhs = false;
return true;
}
@ -72,4 +71,4 @@ bool convert<bool>::decode(const Node& node, bool& rhs) {
return false;
}
}
} // namespace YAML

9
3rdparty/yaml-cpp/src/depthguard.cpp vendored Normal file
View File

@ -0,0 +1,9 @@
#include "yaml-cpp/depthguard.h"
namespace YAML {
DeepRecursion::DeepRecursion(int depth, const Mark& mark_,
const std::string& msg_)
: ParserException(mark_, msg_), m_depth(depth) {}
} // namespace YAML

View File

@ -1,16 +1,11 @@
#include "directives.h"
namespace YAML {
Directives::Directives() {
// version
version.isDefault = true;
version.major = 1;
version.minor = 2;
}
Directives::Directives() : version{true, 1, 2}, tags{} {}
const std::string Directives::TranslateTagHandle(
std::string Directives::TranslateTagHandle(
const std::string& handle) const {
std::map<std::string, std::string>::const_iterator it = tags.find(handle);
auto it = tags.find(handle);
if (it == tags.end()) {
if (handle == "!!")
return "tag:yaml.org,2002:";
@ -19,4 +14,4 @@ const std::string Directives::TranslateTagHandle(
return it->second;
}
}
} // namespace YAML

View File

@ -19,7 +19,7 @@ struct Version {
struct Directives {
Directives();
const std::string TranslateTagHandle(const std::string& handle) const;
std::string TranslateTagHandle(const std::string& handle) const;
Version version;
std::map<std::string, std::string> tags;

View File

@ -1,7 +1,7 @@
#include "yaml-cpp/node/emit.h"
#include "nodeevents.h"
#include "yaml-cpp/emitfromevents.h"
#include "yaml-cpp/emitter.h"
#include "nodeevents.h"
namespace YAML {
Emitter& operator<<(Emitter& out, const Node& node) {

View File

@ -16,10 +16,11 @@ std::string ToString(YAML::anchor_t anchor) {
stream << anchor;
return stream.str();
}
}
} // namespace
namespace YAML {
EmitFromEvents::EmitFromEvents(Emitter& emitter) : m_emitter(emitter) {}
EmitFromEvents::EmitFromEvents(Emitter& emitter)
: m_emitter(emitter), m_stateStack{} {}
void EmitFromEvents::OnDocumentStart(const Mark&) {}
@ -58,6 +59,8 @@ void EmitFromEvents::OnSequenceStart(const Mark&, const std::string& tag,
default:
break;
}
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginSeq;
m_stateStack.push(State::WaitingForSequenceEntry);
}
@ -82,6 +85,8 @@ void EmitFromEvents::OnMapStart(const Mark&, const std::string& tag,
default:
break;
}
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginMap;
m_stateStack.push(State::WaitingForKey);
}
@ -116,4 +121,4 @@ void EmitFromEvents::EmitProps(const std::string& tag, anchor_t anchor) {
if (anchor)
m_emitter << Anchor(ToString(anchor));
}
}
} // namespace YAML

View File

@ -11,12 +11,12 @@ namespace YAML {
class Binary;
struct _Null;
Emitter::Emitter() : m_pState(new EmitterState) {}
Emitter::Emitter() : m_pState(new EmitterState), m_stream{} {}
Emitter::Emitter(std::ostream& stream)
: m_pState(new EmitterState), m_stream(stream) {}
Emitter::~Emitter() {}
Emitter::~Emitter() = default;
const char* Emitter::c_str() const { return m_stream.str(); }
@ -90,6 +90,10 @@ bool Emitter::SetDoublePrecision(std::size_t n) {
return m_pState->SetDoublePrecision(n, FmtScope::Global);
}
void Emitter::RestoreGlobalModifiedSettings() {
m_pState->RestoreGlobalModifiedSettings();
}
// SetLocalValue
// . Either start/end a group, or set a modifier locally
Emitter& Emitter::SetLocalValue(EMITTER_MANIP value) {
@ -201,6 +205,7 @@ void Emitter::EmitBeginSeq() {
void Emitter::EmitEndSeq() {
if (!good())
return;
FlowType::value originalType = m_pState->CurGroupFlowType();
if (m_pState->CurGroupChildCount() == 0)
m_pState->ForceFlow();
@ -209,8 +214,12 @@ void Emitter::EmitEndSeq() {
if (m_stream.comment())
m_stream << "\n";
m_stream << IndentTo(m_pState->CurIndent());
if (m_pState->CurGroupChildCount() == 0)
if (originalType == FlowType::Block) {
m_stream << "[";
} else {
if (m_pState->CurGroupChildCount() == 0 && !m_pState->HasBegunNode())
m_stream << "[";
}
m_stream << "]";
}
@ -231,6 +240,7 @@ void Emitter::EmitBeginMap() {
void Emitter::EmitEndMap() {
if (!good())
return;
FlowType::value originalType = m_pState->CurGroupFlowType();
if (m_pState->CurGroupChildCount() == 0)
m_pState->ForceFlow();
@ -239,8 +249,12 @@ void Emitter::EmitEndMap() {
if (m_stream.comment())
m_stream << "\n";
m_stream << IndentTo(m_pState->CurIndent());
if (m_pState->CurGroupChildCount() == 0)
if (originalType == FlowType::Block) {
m_stream << "{";
} else {
if (m_pState->CurGroupChildCount() == 0 && !m_pState->HasBegunNode())
m_stream << "{";
}
m_stream << "}";
}
@ -289,10 +303,8 @@ void Emitter::PrepareTopNode(EmitterNodeType::value child) {
if (child == EmitterNodeType::NoType)
return;
if (m_pState->CurGroupChildCount() > 0 && m_stream.col() > 0) {
if (child != EmitterNodeType::NoType)
EmitBeginDoc();
}
if (m_pState->CurGroupChildCount() > 0 && m_stream.col() > 0)
EmitBeginDoc();
switch (child) {
case EmitterNodeType::NoType:
@ -492,6 +504,9 @@ void Emitter::FlowMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
if (m_stream.comment())
m_stream << "\n";
m_stream << IndentTo(lastIndent);
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":";
}
@ -518,7 +533,8 @@ void Emitter::BlockMapPrepareNode(EmitterNodeType::value child) {
if (m_pState->GetMapKeyFormat() == LongKey)
m_pState->SetLongKey();
if (child == EmitterNodeType::BlockSeq ||
child == EmitterNodeType::BlockMap)
child == EmitterNodeType::BlockMap ||
child == EmitterNodeType::Property)
m_pState->SetLongKey();
if (m_pState->CurGroupLongKey())
@ -562,6 +578,8 @@ void Emitter::BlockMapPrepareLongKey(EmitterNodeType::value child) {
break;
case EmitterNodeType::BlockSeq:
case EmitterNodeType::BlockMap:
if (m_pState->HasBegunContent())
m_stream << "\n";
break;
}
}
@ -585,8 +603,12 @@ void Emitter::BlockMapPrepareLongKeyValue(EmitterNodeType::value child) {
case EmitterNodeType::Scalar:
case EmitterNodeType::FlowSeq:
case EmitterNodeType::FlowMap:
SpaceOrIndentTo(true, curIndent + 1);
break;
case EmitterNodeType::BlockSeq:
case EmitterNodeType::BlockMap:
if (m_pState->HasBegunContent())
m_stream << "\n";
SpaceOrIndentTo(true, curIndent + 1);
break;
}
@ -625,6 +647,9 @@ void Emitter::BlockMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
const std::size_t nextIndent = curIndent + m_pState->CurGroupIndent();
if (!m_pState->HasBegunNode()) {
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":";
}
@ -678,25 +703,29 @@ void Emitter::StartedScalar() { m_pState->StartedScalar(); }
// *******************************************************************************************
// overloads of Write
StringEscaping::value GetStringEscapingStyle(const EMITTER_MANIP emitterManip) {
switch (emitterManip) {
case EscapeNonAscii:
return StringEscaping::NonAscii;
case EscapeAsJson:
return StringEscaping::JSON;
default:
return StringEscaping::None;
break;
}
}
Emitter& Emitter::Write(const std::string& str) {
if (!good())
return *this;
StringEscaping::value stringEscaping = StringEscaping::None;
switch (m_pState->GetOutputCharset()) {
case EscapeNonAscii:
stringEscaping = StringEscaping::NonAscii;
break;
case EscapeAsJson:
stringEscaping = StringEscaping::JSON;
break;
}
StringEscaping::value stringEscaping = GetStringEscapingStyle(m_pState->GetOutputCharset());
const StringFormat::value strFormat =
Utils::ComputeStringFormat(str, m_pState->GetStringFormat(),
m_pState->CurGroupFlowType(), stringEscaping == StringEscaping::NonAscii);
if (strFormat == StringFormat::Literal)
if (strFormat == StringFormat::Literal || str.size() > 1024)
m_pState->SetMapKeyFormat(YAML::LongKey, FmtScope::Local);
PrepareNode(EmitterNodeType::Scalar);
@ -779,6 +808,21 @@ const char* Emitter::ComputeFullBoolName(bool b) const {
// these answers
}
const char* Emitter::ComputeNullName() const {
switch (m_pState->GetNullFormat()) {
case LowerNull:
return "null";
case UpperNull:
return "NULL";
case CamelNull:
return "Null";
case TildeNull:
// fallthrough
default:
return "~";
}
}
Emitter& Emitter::Write(bool b) {
if (!good())
return *this;
@ -800,10 +844,10 @@ Emitter& Emitter::Write(char ch) {
if (!good())
return *this;
PrepareNode(EmitterNodeType::Scalar);
Utils::WriteChar(m_stream, ch, m_pState->GetOutputCharset() == EscapeAsJson);
Utils::WriteChar(m_stream, ch, GetStringEscapingStyle(m_pState->GetOutputCharset()));
StartedScalar();
return *this;
@ -827,6 +871,8 @@ Emitter& Emitter::Write(const _Alias& alias) {
StartedScalar();
m_pState->SetAlias();
return *this;
}
@ -904,10 +950,7 @@ Emitter& Emitter::Write(const _Null& /*null*/) {
PrepareNode(EmitterNodeType::Scalar);
if (m_pState->GetNullFormat() == NullAsNull)
m_stream << "null";
else
m_stream << "~";
m_stream << ComputeNullName();
StartedScalar();
@ -926,4 +969,4 @@ Emitter& Emitter::Write(const Binary& binary) {
return *this;
}
}
} // namespace YAML

View File

@ -6,30 +6,35 @@
namespace YAML {
EmitterState::EmitterState()
: m_isGood(true),
m_lastError{},
// default global manipulators
m_charset(EmitNonAscii),
m_strFmt(Auto),
m_boolFmt(TrueFalseBool),
m_boolLengthFmt(LongBool),
m_boolCaseFmt(LowerCase),
m_nullFmt(TildeNull),
m_intFmt(Dec),
m_indent(2),
m_preCommentIndent(2),
m_postCommentIndent(1),
m_seqFmt(Block),
m_mapFmt(Block),
m_mapKeyFmt(Auto),
m_floatPrecision(std::numeric_limits<float>::max_digits10),
m_doublePrecision(std::numeric_limits<double>::max_digits10),
//
m_modifiedSettings{},
m_globalModifiedSettings{},
m_groups{},
m_curIndent(0),
m_hasAnchor(false),
m_hasAlias(false),
m_hasTag(false),
m_hasNonContent(false),
m_docCount(0) {
// set default global manipulators
m_charset.set(EmitNonAscii);
m_strFmt.set(Auto);
m_boolFmt.set(TrueFalseBool);
m_nullFmt.set(NullAsTilde);
m_boolLengthFmt.set(LongBool);
m_boolCaseFmt.set(LowerCase);
m_intFmt.set(Dec);
m_indent.set(2);
m_preCommentIndent.set(2);
m_postCommentIndent.set(1);
m_seqFmt.set(Block);
m_mapFmt.set(Block);
m_mapKeyFmt.set(Auto);
m_floatPrecision.set(std::numeric_limits<float>::digits10 + 1);
m_doublePrecision.set(std::numeric_limits<double>::digits10 + 1);
}
m_docCount(0) {}
EmitterState::~EmitterState() {}
EmitterState::~EmitterState() = default;
// SetLocalValue
// . We blindly tries to set all possible formatters to this value
@ -49,6 +54,8 @@ void EmitterState::SetLocalValue(EMITTER_MANIP value) {
void EmitterState::SetAnchor() { m_hasAnchor = true; }
void EmitterState::SetAlias() { m_hasAlias = true; }
void EmitterState::SetTag() { m_hasTag = true; }
void EmitterState::SetNonContent() { m_hasNonContent = true; }
@ -83,6 +90,7 @@ void EmitterState::StartedNode() {
}
m_hasAnchor = false;
m_hasAlias = false;
m_hasTag = false;
m_hasNonContent = false;
}
@ -92,15 +100,13 @@ EmitterNodeType::value EmitterState::NextGroupType(
if (type == GroupType::Seq) {
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockSeq;
else
return EmitterNodeType::FlowSeq;
} else {
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockMap;
else
return EmitterNodeType::FlowMap;
return EmitterNodeType::FlowSeq;
}
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockMap;
return EmitterNodeType::FlowMap;
// can't happen
assert(false);
return EmitterNodeType::NoType;
@ -154,9 +160,15 @@ void EmitterState::EndedGroup(GroupType::value type) {
if (m_groups.empty()) {
if (type == GroupType::Seq) {
return SetError(ErrorMsg::UNEXPECTED_END_SEQ);
} else {
return SetError(ErrorMsg::UNEXPECTED_END_MAP);
}
return SetError(ErrorMsg::UNEXPECTED_END_MAP);
}
if (m_hasTag) {
SetError(ErrorMsg::INVALID_TAG);
}
if (m_hasAnchor) {
SetError(ErrorMsg::INVALID_ANCHOR);
}
// get rid of the current group
@ -178,6 +190,9 @@ void EmitterState::EndedGroup(GroupType::value type) {
m_globalModifiedSettings.restore();
ClearModifiedSettings();
m_hasAnchor = false;
m_hasTag = false;
m_hasNonContent = false;
}
EmitterNodeType::value EmitterState::CurGroupNodeType() const {
@ -218,6 +233,10 @@ std::size_t EmitterState::LastIndent() const {
void EmitterState::ClearModifiedSettings() { m_modifiedSettings.clear(); }
void EmitterState::RestoreGlobalModifiedSettings() {
m_globalModifiedSettings.restore();
}
bool EmitterState::SetOutputCharset(EMITTER_MANIP value,
FmtScope::value scope) {
switch (value) {
@ -283,12 +302,14 @@ bool EmitterState::SetBoolCaseFormat(EMITTER_MANIP value,
bool EmitterState::SetNullFormat(EMITTER_MANIP value, FmtScope::value scope) {
switch (value) {
case NullAsTilde:
case NullAsNull:
_Set(m_nullFmt, value, scope);
return true;
default:
return false;
case LowerNull:
case UpperNull:
case CamelNull:
case TildeNull:
_Set(m_nullFmt, value, scope);
return true;
default:
return false;
}
}
@ -363,7 +384,7 @@ bool EmitterState::SetMapKeyFormat(EMITTER_MANIP value, FmtScope::value scope) {
}
bool EmitterState::SetFloatPrecision(std::size_t value, FmtScope::value scope) {
if (value > std::numeric_limits<float>::digits10 + 1)
if (value > std::numeric_limits<float>::max_digits10)
return false;
_Set(m_floatPrecision, value, scope);
return true;
@ -371,9 +392,9 @@ bool EmitterState::SetFloatPrecision(std::size_t value, FmtScope::value scope) {
bool EmitterState::SetDoublePrecision(std::size_t value,
FmtScope::value scope) {
if (value > std::numeric_limits<double>::digits10 + 1)
if (value > std::numeric_limits<double>::max_digits10)
return false;
_Set(m_doublePrecision, value, scope);
return true;
}
}
} // namespace YAML

View File

@ -43,6 +43,7 @@ class EmitterState {
// node handling
void SetAnchor();
void SetAlias();
void SetTag();
void SetNonContent();
void SetLongKey();
@ -65,6 +66,7 @@ class EmitterState {
std::size_t LastIndent() const;
std::size_t CurIndent() const { return m_curIndent; }
bool HasAnchor() const { return m_hasAnchor; }
bool HasAlias() const { return m_hasAlias; }
bool HasTag() const { return m_hasTag; }
bool HasBegunNode() const {
return m_hasAnchor || m_hasTag || m_hasNonContent;
@ -72,6 +74,7 @@ class EmitterState {
bool HasBegunContent() const { return m_hasAnchor || m_hasTag; }
void ClearModifiedSettings();
void RestoreGlobalModifiedSettings();
// formatters
void SetLocalValue(EMITTER_MANIP value);
@ -132,9 +135,9 @@ class EmitterState {
Setting<EMITTER_MANIP> m_charset;
Setting<EMITTER_MANIP> m_strFmt;
Setting<EMITTER_MANIP> m_boolFmt;
Setting<EMITTER_MANIP> m_nullFmt;
Setting<EMITTER_MANIP> m_boolLengthFmt;
Setting<EMITTER_MANIP> m_boolCaseFmt;
Setting<EMITTER_MANIP> m_nullFmt;
Setting<EMITTER_MANIP> m_intFmt;
Setting<std::size_t> m_indent;
Setting<std::size_t> m_preCommentIndent, m_postCommentIndent;
@ -149,7 +152,12 @@ class EmitterState {
struct Group {
explicit Group(GroupType::value type_)
: type(type_), indent(0), childCount(0), longKey(false) {}
: type(type_),
flowType{},
indent(0),
childCount(0),
longKey(false),
modifiedSettings{} {}
GroupType::value type;
FlowType::value flowType;
@ -181,6 +189,7 @@ class EmitterState {
std::vector<std::unique_ptr<Group>> m_groups;
std::size_t m_curIndent;
bool m_hasAnchor;
bool m_hasAlias;
bool m_hasTag;
bool m_hasNonContent;
std::size_t m_docCount;
@ -202,6 +211,6 @@ void EmitterState::_Set(Setting<T>& fmt, T value, FmtScope::value scope) {
assert(false);
}
}
}
} // namespace YAML
#endif // EMITTERSTATE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -1,3 +1,4 @@
#include <algorithm>
#include <iomanip>
#include <sstream>
@ -8,8 +9,8 @@
#include "regeximpl.h"
#include "stringsource.h"
#include "yaml-cpp/binary.h" // IWYU pragma: keep
#include "yaml-cpp/ostream_wrapper.h"
#include "yaml-cpp/null.h"
#include "yaml-cpp/ostream_wrapper.h"
namespace YAML {
namespace Utils {
@ -134,12 +135,12 @@ void WriteCodePoint(ostream_wrapper& out, int codePoint) {
if (codePoint < 0 || codePoint > 0x10FFFF) {
codePoint = REPLACEMENT_CHARACTER;
}
if (codePoint < 0x7F) {
if (codePoint <= 0x7F) {
out << static_cast<char>(codePoint);
} else if (codePoint < 0x7FF) {
} else if (codePoint <= 0x7FF) {
out << static_cast<char>(0xC0 | (codePoint >> 6))
<< static_cast<char>(0x80 | (codePoint & 0x3F));
} else if (codePoint < 0xFFFF) {
} else if (codePoint <= 0xFFFF) {
out << static_cast<char>(0xE0 | (codePoint >> 12))
<< static_cast<char>(0x80 | ((codePoint >> 6) & 0x3F))
<< static_cast<char>(0x80 | (codePoint & 0x3F));
@ -173,13 +174,13 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
// then check until something is disallowed
static const RegEx& disallowed_flow =
Exp::EndScalarInFlow() || (Exp::BlankOrBreak() + Exp::Comment()) ||
Exp::NotPrintable() || Exp::Utf8_ByteOrderMark() || Exp::Break() ||
Exp::Tab();
Exp::EndScalarInFlow() | (Exp::BlankOrBreak() + Exp::Comment()) |
Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() |
Exp::Tab() | Exp::Ampersand();
static const RegEx& disallowed_block =
Exp::EndScalar() || (Exp::BlankOrBreak() + Exp::Comment()) ||
Exp::NotPrintable() || Exp::Utf8_ByteOrderMark() || Exp::Break() ||
Exp::Tab();
Exp::EndScalar() | (Exp::BlankOrBreak() + Exp::Comment()) |
Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() |
Exp::Tab() | Exp::Ampersand();
const RegEx& disallowed =
flowType == FlowType::Flow ? disallowed_flow : disallowed_block;
@ -199,15 +200,10 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
bool IsValidSingleQuotedScalar(const std::string& str, bool escapeNonAscii) {
// TODO: check for non-printable characters?
for (std::size_t i = 0; i < str.size(); i++) {
if (escapeNonAscii && (0x80 <= static_cast<unsigned char>(str[i]))) {
return false;
}
if (str[i] == '\n') {
return false;
}
}
return true;
return std::none_of(str.begin(), str.end(), [=](char ch) {
return (escapeNonAscii && (0x80 <= static_cast<unsigned char>(ch))) ||
(ch == '\n');
});
}
bool IsValidLiteralScalar(const std::string& str, FlowType::value flowType,
@ -217,12 +213,9 @@ bool IsValidLiteralScalar(const std::string& str, FlowType::value flowType,
}
// TODO: check for non-printable characters?
for (std::size_t i = 0; i < str.size(); i++) {
if (escapeNonAscii && (0x80 <= static_cast<unsigned char>(str[i]))) {
return false;
}
}
return true;
return std::none_of(str.begin(), str.end(), [=](char ch) {
return (escapeNonAscii && (0x80 <= static_cast<unsigned char>(ch)));
});
}
std::pair<uint16_t, uint16_t> EncodeUTF16SurrogatePair(int codePoint) {
@ -234,24 +227,24 @@ std::pair<uint16_t, uint16_t> EncodeUTF16SurrogatePair(int codePoint) {
};
}
void WriteDoubleQuoteEscapeSequence(ostream_wrapper& out, int codePoint, bool escapeAsJson) {
void WriteDoubleQuoteEscapeSequence(ostream_wrapper& out, int codePoint, StringEscaping::value stringEscapingStyle) {
static const char hexDigits[] = "0123456789abcdef";
out << "\\";
int digits = 8;
if (codePoint < 0xFF && !escapeAsJson) {
if (codePoint < 0xFF && stringEscapingStyle != StringEscaping::JSON) {
out << "x";
digits = 2;
} else if (codePoint < 0xFFFF) {
out << "u";
digits = 4;
} else if (!escapeAsJson) {
} else if (stringEscapingStyle != StringEscaping::JSON) {
out << "U";
digits = 8;
} else {
auto surrogatePair = EncodeUTF16SurrogatePair(codePoint);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.first, true);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.second, true);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.first, stringEscapingStyle);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.second, stringEscapingStyle);
return;
}
@ -272,7 +265,7 @@ bool WriteAliasName(ostream_wrapper& out, const std::string& str) {
}
return true;
}
}
} // namespace
StringFormat::value ComputeStringFormat(const std::string& str,
EMITTER_MANIP strFormat,
@ -355,12 +348,12 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
if (codePoint < 0x20 ||
(codePoint >= 0x80 &&
codePoint <= 0xA0)) { // Control characters and non-breaking space
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping == StringEscaping::JSON);
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping);
} else if (codePoint == 0xFEFF) { // Byte order marks (ZWNS) should be
// escaped (YAML 1.2, sec. 5.2)
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping == StringEscaping::JSON);
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping);
} else if (stringEscaping == StringEscaping::NonAscii && codePoint > 0x7E) {
WriteDoubleQuoteEscapeSequence(out, codePoint, false);
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping);
} else {
WriteCodePoint(out, codePoint);
}
@ -373,41 +366,41 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
std::size_t indent) {
out << "|\n";
out << IndentTo(indent);
int codePoint;
for (std::string::const_iterator i = str.begin();
GetNextCodePointAndAdvance(codePoint, i, str.end());) {
if (codePoint == '\n') {
out << "\n" << IndentTo(indent);
out << "\n";
} else {
out<< IndentTo(indent);
WriteCodePoint(out, codePoint);
}
}
return true;
}
bool WriteChar(ostream_wrapper& out, char ch, bool escapeAsJson) {
bool WriteChar(ostream_wrapper& out, char ch, StringEscaping::value stringEscapingStyle) {
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) {
out << ch;
} else if (ch == '\"') {
out << "\"\\\"\"";
out << R"("\"")";
} else if (ch == '\t') {
out << "\"\\t\"";
out << R"("\t")";
} else if (ch == '\n') {
out << "\"\\n\"";
out << R"("\n")";
} else if (ch == '\b') {
out << "\"\\b\"";
out << R"("\b")";
} else if (ch == '\r') {
out << "\"\\r\"";
out << R"("\r")";
} else if (ch == '\f') {
out << "\"\\f\"";
out << R"("\f")";
} else if (ch == '\\') {
out << "\"\\\\\"";
} else if ((0x20 <= ch && ch <= 0x7e) || ch == ' ') {
out << R"("\\")";
} else if (0x20 <= ch && ch <= 0x7e) {
out << "\"" << ch << "\"";
} else {
out << "\"";
WriteDoubleQuoteEscapeSequence(out, ch, escapeAsJson);
WriteDoubleQuoteEscapeSequence(out, ch, stringEscapingStyle);
out << "\"";
}
return true;
@ -422,8 +415,8 @@ bool WriteComment(ostream_wrapper& out, const std::string& str,
for (std::string::const_iterator i = str.begin();
GetNextCodePointAndAdvance(codePoint, i, str.end());) {
if (codePoint == '\n') {
out << "\n" << IndentTo(curIndent) << "#"
<< Indentation(postCommentIndent);
out << "\n"
<< IndentTo(curIndent) << "#" << Indentation(postCommentIndent);
out.set_comment();
} else {
WriteCodePoint(out, codePoint);
@ -500,5 +493,5 @@ bool WriteBinary(ostream_wrapper& out, const Binary& binary) {
StringEscaping::None);
return true;
}
}
}
} // namespace Utils
} // namespace YAML

View File

@ -39,7 +39,8 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
StringEscaping::value stringEscaping);
bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
std::size_t indent);
bool WriteChar(ostream_wrapper& out, char ch, bool escapeAsJson);
bool WriteChar(ostream_wrapper& out, char ch,
StringEscaping::value stringEscapingStyle);
bool WriteComment(ostream_wrapper& out, const std::string& str,
std::size_t postCommentIndent);
bool WriteAlias(ostream_wrapper& out, const std::string& str);

View File

@ -1,19 +1,20 @@
#include "yaml-cpp/exceptions.h"
#include "yaml-cpp/noexcept.h"
namespace YAML {
// These destructors are defined out-of-line so the vtable is only emitted once.
Exception::~Exception() NOEXCEPT {}
ParserException::~ParserException() NOEXCEPT {}
RepresentationException::~RepresentationException() NOEXCEPT {}
InvalidScalar::~InvalidScalar() NOEXCEPT {}
KeyNotFound::~KeyNotFound() NOEXCEPT {}
InvalidNode::~InvalidNode() NOEXCEPT {}
BadConversion::~BadConversion() NOEXCEPT {}
BadDereference::~BadDereference() NOEXCEPT {}
BadSubscript::~BadSubscript() NOEXCEPT {}
BadPushback::~BadPushback() NOEXCEPT {}
BadInsert::~BadInsert() NOEXCEPT {}
EmitterException::~EmitterException() NOEXCEPT {}
BadFile::~BadFile() NOEXCEPT {}
}
Exception::~Exception() YAML_CPP_NOEXCEPT = default;
ParserException::~ParserException() YAML_CPP_NOEXCEPT = default;
RepresentationException::~RepresentationException() YAML_CPP_NOEXCEPT = default;
InvalidScalar::~InvalidScalar() YAML_CPP_NOEXCEPT = default;
KeyNotFound::~KeyNotFound() YAML_CPP_NOEXCEPT = default;
InvalidNode::~InvalidNode() YAML_CPP_NOEXCEPT = default;
BadConversion::~BadConversion() YAML_CPP_NOEXCEPT = default;
BadDereference::~BadDereference() YAML_CPP_NOEXCEPT = default;
BadSubscript::~BadSubscript() YAML_CPP_NOEXCEPT = default;
BadPushback::~BadPushback() YAML_CPP_NOEXCEPT = default;
BadInsert::~BadInsert() YAML_CPP_NOEXCEPT = default;
EmitterException::~EmitterException() YAML_CPP_NOEXCEPT = default;
BadFile::~BadFile() YAML_CPP_NOEXCEPT = default;
} // namespace YAML

View File

@ -12,8 +12,7 @@ namespace YAML {
namespace Exp {
unsigned ParseHex(const std::string& str, const Mark& mark) {
unsigned value = 0;
for (std::size_t i = 0; i < str.size(); i++) {
char ch = str[i];
for (char ch : str) {
int digit = 0;
if ('a' <= ch && ch <= 'f')
digit = ch - 'a' + 10;
@ -55,14 +54,16 @@ std::string Escape(Stream& in, int codeLength) {
// now break it up into chars
if (value <= 0x7F)
return Str(value);
else if (value <= 0x7FF)
if (value <= 0x7FF)
return Str(0xC0 + (value >> 6)) + Str(0x80 + (value & 0x3F));
else if (value <= 0xFFFF)
if (value <= 0xFFFF)
return Str(0xE0 + (value >> 12)) + Str(0x80 + ((value >> 6) & 0x3F)) +
Str(0x80 + (value & 0x3F));
else
return Str(0xF0 + (value >> 18)) + Str(0x80 + ((value >> 12) & 0x3F)) +
Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F));
return Str(0xF0 + (value >> 18)) + Str(0x80 + ((value >> 12) & 0x3F)) +
Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F));
}
// Escape
@ -104,7 +105,7 @@ std::string Escape(Stream& in) {
case 'e':
return "\x1B";
case ' ':
return "\x20";
return R"( )";
case '\"':
return "\"";
case '\'':
@ -132,5 +133,5 @@ std::string Escape(Stream& in) {
std::stringstream msg;
throw ParserException(in.mark(), std::string(ErrorMsg::INVALID_ESCAPE) + ch);
}
}
}
} // namespace Exp
} // namespace YAML

View File

@ -33,15 +33,15 @@ inline const RegEx& Tab() {
return e;
}
inline const RegEx& Blank() {
static const RegEx e = Space() || Tab();
static const RegEx e = Space() | Tab();
return e;
}
inline const RegEx& Break() {
static const RegEx e = RegEx('\n') || RegEx("\r\n");
static const RegEx e = RegEx('\n') | RegEx("\r\n") | RegEx('\r');
return e;
}
inline const RegEx& BlankOrBreak() {
static const RegEx e = Blank() || Break();
static const RegEx e = Blank() | Break();
return e;
}
inline const RegEx& Digit() {
@ -49,29 +49,29 @@ inline const RegEx& Digit() {
return e;
}
inline const RegEx& Alpha() {
static const RegEx e = RegEx('a', 'z') || RegEx('A', 'Z');
static const RegEx e = RegEx('a', 'z') | RegEx('A', 'Z');
return e;
}
inline const RegEx& AlphaNumeric() {
static const RegEx e = Alpha() || Digit();
static const RegEx e = Alpha() | Digit();
return e;
}
inline const RegEx& Word() {
static const RegEx e = AlphaNumeric() || RegEx('-');
static const RegEx e = AlphaNumeric() | RegEx('-');
return e;
}
inline const RegEx& Hex() {
static const RegEx e = Digit() || RegEx('A', 'F') || RegEx('a', 'f');
static const RegEx e = Digit() | RegEx('A', 'F') | RegEx('a', 'f');
return e;
}
// Valid Unicode code points that are not part of c-printable (YAML 1.2, sec.
// 5.1)
inline const RegEx& NotPrintable() {
static const RegEx e =
RegEx(0) ||
RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) ||
RegEx(0x0E, 0x1F) ||
(RegEx('\xC2') + (RegEx('\x80', '\x84') || RegEx('\x86', '\x9F')));
RegEx(0) |
RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) |
RegEx(0x0E, 0x1F) |
(RegEx('\xC2') + (RegEx('\x80', '\x84') | RegEx('\x86', '\x9F')));
return e;
}
inline const RegEx& Utf8_ByteOrderMark() {
@ -82,19 +82,19 @@ inline const RegEx& Utf8_ByteOrderMark() {
// actual tags
inline const RegEx& DocStart() {
static const RegEx e = RegEx("---") + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx("---") + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& DocEnd() {
static const RegEx e = RegEx("...") + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx("...") + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& DocIndicator() {
static const RegEx e = DocStart() || DocEnd();
static const RegEx e = DocStart() | DocEnd();
return e;
}
inline const RegEx& BlockEntry() {
static const RegEx e = RegEx('-') + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx('-') + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& Key() {
@ -106,36 +106,40 @@ inline const RegEx& KeyInFlow() {
return e;
}
inline const RegEx& Value() {
static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& ValueInFlow() {
static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx(",}", REGEX_OR));
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx(",]}", REGEX_OR));
return e;
}
inline const RegEx& ValueInJSONFlow() {
static const RegEx e = RegEx(':');
return e;
}
inline const RegEx& Ampersand() {
static const RegEx e = RegEx('&');
return e;
}
inline const RegEx Comment() {
static const RegEx e = RegEx('#');
return e;
}
inline const RegEx& Anchor() {
static const RegEx e = !(RegEx("[]{},", REGEX_OR) || BlankOrBreak());
static const RegEx e = !(RegEx("[]{},", REGEX_OR) | BlankOrBreak());
return e;
}
inline const RegEx& AnchorEnd() {
static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) || BlankOrBreak();
static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) | BlankOrBreak();
return e;
}
inline const RegEx& URI() {
static const RegEx e = Word() || RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) ||
static const RegEx e = Word() | RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) |
(RegEx('%') + Hex() + Hex());
return e;
}
inline const RegEx& Tag() {
static const RegEx e = Word() || RegEx("#;/?:@&=+$_.~*'", REGEX_OR) ||
static const RegEx e = Word() | RegEx("#;/?:@&=+$_.~*'()", REGEX_OR) |
(RegEx('%') + Hex() + Hex());
return e;
}
@ -148,34 +152,34 @@ inline const RegEx& Tag() {
// space.
inline const RegEx& PlainScalar() {
static const RegEx e =
!(BlankOrBreak() || RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) ||
(RegEx("-?:", REGEX_OR) + (BlankOrBreak() || RegEx())));
!(BlankOrBreak() | RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) |
(RegEx("-?:", REGEX_OR) + (BlankOrBreak() | RegEx())));
return e;
}
inline const RegEx& PlainScalarInFlow() {
static const RegEx e =
!(BlankOrBreak() || RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) ||
(RegEx("-:", REGEX_OR) + Blank()));
!(BlankOrBreak() | RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) |
(RegEx("-:", REGEX_OR) + (Blank() | RegEx())));
return e;
}
inline const RegEx& EndScalar() {
static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& EndScalarInFlow() {
static const RegEx e =
(RegEx(':') + (BlankOrBreak() || RegEx() || RegEx(",]}", REGEX_OR))) ||
(RegEx(':') + (BlankOrBreak() | RegEx() | RegEx(",]}", REGEX_OR))) |
RegEx(",?[]{}", REGEX_OR);
return e;
}
inline const RegEx& ScanScalarEndInFlow() {
static const RegEx e = (EndScalarInFlow() || (BlankOrBreak() + Comment()));
static const RegEx e = (EndScalarInFlow() | (BlankOrBreak() + Comment()));
return e;
}
inline const RegEx& ScanScalarEnd() {
static const RegEx e = EndScalar() || (BlankOrBreak() + Comment());
static const RegEx e = EndScalar() | (BlankOrBreak() + Comment());
return e;
}
inline const RegEx& EscSingleQuote() {
@ -192,15 +196,15 @@ inline const RegEx& ChompIndicator() {
return e;
}
inline const RegEx& Chomp() {
static const RegEx e = (ChompIndicator() + Digit()) ||
(Digit() + ChompIndicator()) || ChompIndicator() ||
static const RegEx e = (ChompIndicator() + Digit()) |
(Digit() + ChompIndicator()) | ChompIndicator() |
Digit();
return e;
}
// and some functions
std::string Escape(Stream& in);
}
} // namespace Exp
namespace Keys {
const char Directive = '%';
@ -216,7 +220,7 @@ const char LiteralScalar = '|';
const char FoldedScalar = '>';
const char VerbatimTagStart = '<';
const char VerbatimTagEnd = '>';
}
}
} // namespace Keys
} // namespace YAML
#endif // EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -22,5 +22,5 @@ node& memory::create_node() {
void memory::merge(const memory& rhs) {
m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end());
}
}
}
} // namespace detail
} // namespace YAML

View File

@ -9,4 +9,4 @@ Node Clone(const Node& node) {
events.Emit(builder);
return builder.Root();
}
}
} // namespace YAML

View File

@ -1,4 +1,5 @@
#include <assert.h>
#include <algorithm>
#include <cassert>
#include <iterator>
#include <sstream>
@ -12,15 +13,24 @@
namespace YAML {
namespace detail {
YAML_CPP_API std::atomic<size_t> node::m_amount{0};
std::string node_data::empty_scalar;
const std::string& node_data::empty_scalar() {
static const std::string svalue;
return svalue;
}
node_data::node_data()
: m_isDefined(false),
m_mark(Mark::null_mark()),
m_type(NodeType::Null),
m_tag{},
m_style(EmitterStyle::Default),
m_seqSize(0) {}
m_scalar{},
m_sequence{},
m_seqSize(0),
m_map{},
m_undefinedPairs{} {}
void node_data::mark_defined() {
if (m_type == NodeType::Undefined)
@ -100,9 +110,9 @@ void node_data::compute_seq_size() const {
}
void node_data::compute_map_size() const {
kv_pairs::iterator it = m_undefinedPairs.begin();
auto it = m_undefinedPairs.begin();
while (it != m_undefinedPairs.end()) {
kv_pairs::iterator jt = std::next(it);
auto jt = std::next(it);
if (it->first->is_defined() && it->second->is_defined())
m_undefinedPairs.erase(it);
it = jt;
@ -111,7 +121,7 @@ void node_data::compute_map_size() const {
const_node_iterator node_data::begin() const {
if (!m_isDefined)
return const_node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@ -119,13 +129,13 @@ const_node_iterator node_data::begin() const {
case NodeType::Map:
return const_node_iterator(m_map.begin(), m_map.end());
default:
return const_node_iterator();
return {};
}
}
node_iterator node_data::begin() {
if (!m_isDefined)
return node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@ -133,13 +143,13 @@ node_iterator node_data::begin() {
case NodeType::Map:
return node_iterator(m_map.begin(), m_map.end());
default:
return node_iterator();
return {};
}
}
const_node_iterator node_data::end() const {
if (!m_isDefined)
return const_node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@ -147,13 +157,13 @@ const_node_iterator node_data::end() const {
case NodeType::Map:
return const_node_iterator(m_map.end(), m_map.end());
default:
return const_node_iterator();
return {};
}
}
node_iterator node_data::end() {
if (!m_isDefined)
return node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@ -161,12 +171,13 @@ node_iterator node_data::end() {
case NodeType::Map:
return node_iterator(m_map.end(), m_map.end());
default:
return node_iterator();
return {};
}
}
// sequence
void node_data::push_back(node& node, shared_memory_holder /* pMemory */) {
void node_data::push_back(node& node,
const shared_memory_holder& /* pMemory */) {
if (m_type == NodeType::Undefined || m_type == NodeType::Null) {
m_type = NodeType::Sequence;
reset_sequence();
@ -178,7 +189,8 @@ void node_data::push_back(node& node, shared_memory_holder /* pMemory */) {
m_sequence.push_back(&node);
}
void node_data::insert(node& key, node& value, shared_memory_holder pMemory) {
void node_data::insert(node& key, node& value,
const shared_memory_holder& pMemory) {
switch (m_type) {
case NodeType::Map:
break;
@ -188,27 +200,28 @@ void node_data::insert(node& key, node& value, shared_memory_holder pMemory) {
convert_to_map(pMemory);
break;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
insert_map_pair(key, value);
}
// indexing
node* node_data::get(node& key, shared_memory_holder /* pMemory */) const {
node* node_data::get(node& key,
const shared_memory_holder& /* pMemory */) const {
if (m_type != NodeType::Map) {
return NULL;
return nullptr;
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->is(key))
return it->second;
for (const auto& it : m_map) {
if (it.first->is(key))
return it.second;
}
return NULL;
return nullptr;
}
node& node_data::get(node& key, shared_memory_holder pMemory) {
node& node_data::get(node& key, const shared_memory_holder& pMemory) {
switch (m_type) {
case NodeType::Map:
break;
@ -218,12 +231,12 @@ node& node_data::get(node& key, shared_memory_holder pMemory) {
convert_to_map(pMemory);
break;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->is(key))
return *it->second;
for (const auto& it : m_map) {
if (it.first->is(key))
return *it.second;
}
node& value = pMemory->create_node();
@ -231,15 +244,26 @@ node& node_data::get(node& key, shared_memory_holder pMemory) {
return value;
}
bool node_data::remove(node& key, shared_memory_holder /* pMemory */) {
bool node_data::remove(node& key, const shared_memory_holder& /* pMemory */) {
if (m_type != NodeType::Map)
return false;
for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->is(key)) {
m_map.erase(it);
return true;
}
for (auto it = m_undefinedPairs.begin(); it != m_undefinedPairs.end();) {
auto jt = std::next(it);
if (it->first->is(key))
m_undefinedPairs.erase(it);
it = jt;
}
auto it =
std::find_if(m_map.begin(), m_map.end(),
[&](std::pair<YAML::detail::node*, YAML::detail::node*> j) {
return (j.first->is(key));
});
if (it != m_map.end()) {
m_map.erase(it);
return true;
}
return false;
@ -262,7 +286,7 @@ void node_data::insert_map_pair(node& key, node& value) {
m_undefinedPairs.emplace_back(&key, &value);
}
void node_data::convert_to_map(shared_memory_holder pMemory) {
void node_data::convert_to_map(const shared_memory_holder& pMemory) {
switch (m_type) {
case NodeType::Undefined:
case NodeType::Null:
@ -280,7 +304,7 @@ void node_data::convert_to_map(shared_memory_holder pMemory) {
}
}
void node_data::convert_sequence_to_map(shared_memory_holder pMemory) {
void node_data::convert_sequence_to_map(const shared_memory_holder& pMemory) {
assert(m_type == NodeType::Sequence);
reset_map();
@ -296,5 +320,5 @@ void node_data::convert_sequence_to_map(shared_memory_holder pMemory) {
reset_sequence();
m_type = NodeType::Map;
}
}
}
} // namespace detail
} // namespace YAML

View File

@ -1,4 +1,3 @@
#include <assert.h>
#include <cassert>
#include "nodebuilder.h"
@ -11,11 +10,16 @@ namespace YAML {
struct Mark;
NodeBuilder::NodeBuilder()
: m_pMemory(new detail::memory_holder), m_pRoot(0), m_mapDepth(0) {
m_anchors.push_back(0); // since the anchors start at 1
: m_pMemory(new detail::memory_holder),
m_pRoot(nullptr),
m_stack{},
m_anchors{},
m_keys{},
m_mapDepth(0) {
m_anchors.push_back(nullptr); // since the anchors start at 1
}
NodeBuilder::~NodeBuilder() {}
NodeBuilder::~NodeBuilder() = default;
Node NodeBuilder::Root() {
if (!m_pRoot)
@ -88,7 +92,7 @@ void NodeBuilder::Push(detail::node& node) {
m_stack.push_back(&node);
if (needsKey)
m_keys.push_back(PushedKey(&node, false));
m_keys.emplace_back(&node, false);
}
void NodeBuilder::Pop() {
@ -127,4 +131,4 @@ void NodeBuilder::RegisterAnchor(anchor_t anchor, detail::node& node) {
m_anchors.push_back(&node);
}
}
}
} // namespace YAML

View File

@ -27,25 +27,29 @@ class Node;
class NodeBuilder : public EventHandler {
public:
NodeBuilder();
virtual ~NodeBuilder();
NodeBuilder(const NodeBuilder&) = delete;
NodeBuilder(NodeBuilder&&) = delete;
NodeBuilder& operator=(const NodeBuilder&) = delete;
NodeBuilder& operator=(NodeBuilder&&) = delete;
~NodeBuilder() override;
Node Root();
virtual void OnDocumentStart(const Mark& mark);
virtual void OnDocumentEnd();
void OnDocumentStart(const Mark& mark) override;
void OnDocumentEnd() override;
virtual void OnNull(const Mark& mark, anchor_t anchor);
virtual void OnAlias(const Mark& mark, anchor_t anchor);
virtual void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value);
void OnNull(const Mark& mark, anchor_t anchor) override;
void OnAlias(const Mark& mark, anchor_t anchor) override;
void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value) override;
virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnSequenceEnd();
void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnSequenceEnd() override;
virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnMapEnd();
void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnMapEnd() override;
private:
detail::node& Push(const Mark& mark, anchor_t anchor);
@ -57,14 +61,14 @@ class NodeBuilder : public EventHandler {
detail::shared_memory_holder m_pMemory;
detail::node* m_pRoot;
typedef std::vector<detail::node*> Nodes;
using Nodes = std::vector<detail::node *>;
Nodes m_stack;
Nodes m_anchors;
typedef std::pair<detail::node*, bool> PushedKey;
using PushedKey = std::pair<detail::node*, bool>;
std::vector<PushedKey> m_keys;
std::size_t m_mapDepth;
};
}
} // namespace YAML
#endif // NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -13,14 +13,14 @@ void NodeEvents::AliasManager::RegisterReference(const detail::node& node) {
anchor_t NodeEvents::AliasManager::LookupAnchor(
const detail::node& node) const {
AnchorByIdentity::const_iterator it = m_anchorByIdentity.find(node.ref());
auto it = m_anchorByIdentity.find(node.ref());
if (it == m_anchorByIdentity.end())
return 0;
return it->second;
}
NodeEvents::NodeEvents(const Node& node)
: m_pMemory(node.m_pMemory), m_root(node.m_pNode) {
: m_pMemory(node.m_pMemory), m_root(node.m_pNode), m_refCount{} {
if (m_root)
Setup(*m_root);
}
@ -32,13 +32,12 @@ void NodeEvents::Setup(const detail::node& node) {
return;
if (node.type() == NodeType::Sequence) {
for (detail::const_node_iterator it = node.begin(); it != node.end(); ++it)
Setup(**it);
for (auto element : node)
Setup(*element);
} else if (node.type() == NodeType::Map) {
for (detail::const_node_iterator it = node.begin(); it != node.end();
++it) {
Setup(*it->first);
Setup(*it->second);
for (auto element : node) {
Setup(*element.first);
Setup(*element.second);
}
}
}
@ -77,17 +76,15 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
break;
case NodeType::Sequence:
handler.OnSequenceStart(Mark(), node.tag(), anchor, node.style());
for (detail::const_node_iterator it = node.begin(); it != node.end();
++it)
Emit(**it, handler, am);
for (auto element : node)
Emit(*element, handler, am);
handler.OnSequenceEnd();
break;
case NodeType::Map:
handler.OnMapStart(Mark(), node.tag(), anchor, node.style());
for (detail::const_node_iterator it = node.begin(); it != node.end();
++it) {
Emit(*it->first, handler, am);
Emit(*it->second, handler, am);
for (auto element : node) {
Emit(*element.first, handler, am);
Emit(*element.second, handler, am);
}
handler.OnMapEnd();
break;
@ -95,7 +92,7 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
}
bool NodeEvents::IsAliased(const detail::node& node) const {
RefCount::const_iterator it = m_refCount.find(node.ref());
auto it = m_refCount.find(node.ref());
return it != m_refCount.end() && it->second > 1;
}
}
} // namespace YAML

View File

@ -26,13 +26,17 @@ class Node;
class NodeEvents {
public:
explicit NodeEvents(const Node& node);
NodeEvents(const NodeEvents&) = delete;
NodeEvents(NodeEvents&&) = delete;
NodeEvents& operator=(const NodeEvents&) = delete;
NodeEvents& operator=(NodeEvents&&) = delete;
void Emit(EventHandler& handler);
private:
class AliasManager {
public:
AliasManager() : m_curAnchor(0) {}
AliasManager() : m_anchorByIdentity{}, m_curAnchor(0) {}
void RegisterReference(const detail::node& node);
anchor_t LookupAnchor(const detail::node& node) const;
@ -41,7 +45,7 @@ class NodeEvents {
anchor_t _CreateNewAnchor() { return ++m_curAnchor; }
private:
typedef std::map<const detail::node_ref*, anchor_t> AnchorByIdentity;
using AnchorByIdentity = std::map<const detail::node_ref*, anchor_t>;
AnchorByIdentity m_anchorByIdentity;
anchor_t m_curAnchor;
@ -56,9 +60,9 @@ class NodeEvents {
detail::shared_memory_holder m_pMemory;
detail::node* m_root;
typedef std::map<const detail::node_ref*, int> RefCount;
using RefCount = std::map<const detail::node_ref*, int>;
RefCount m_refCount;
};
}
} // namespace YAML
#endif // NODE_NODEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -7,4 +7,4 @@ bool IsNullString(const std::string& str) {
return str.empty() || str == "~" || str == "null" || str == "Null" ||
str == "NULL";
}
}
} // namespace YAML

View File

@ -7,16 +7,21 @@
namespace YAML {
ostream_wrapper::ostream_wrapper()
: m_buffer(1, '\0'),
m_pStream(0),
m_pStream(nullptr),
m_pos(0),
m_row(0),
m_col(0),
m_comment(false) {}
ostream_wrapper::ostream_wrapper(std::ostream& stream)
: m_pStream(&stream), m_pos(0), m_row(0), m_col(0), m_comment(false) {}
: m_buffer{},
m_pStream(&stream),
m_pos(0),
m_row(0),
m_col(0),
m_comment(false) {}
ostream_wrapper::~ostream_wrapper() {}
ostream_wrapper::~ostream_wrapper() = default;
void ostream_wrapper::write(const std::string& str) {
if (m_pStream) {
@ -26,8 +31,8 @@ void ostream_wrapper::write(const std::string& str) {
std::copy(str.begin(), str.end(), m_buffer.begin() + m_pos);
}
for (std::size_t i = 0; i < str.size(); i++) {
update_pos(str[i]);
for (char ch : str) {
update_pos(ch);
}
}
@ -54,4 +59,4 @@ void ostream_wrapper::update_pos(char ch) {
m_comment = false;
}
}
}
} // namespace YAML

View File

@ -3,10 +3,10 @@
#include <fstream>
#include <sstream>
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/parser.h"
#include "nodebuilder.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/parser.h"
namespace YAML {
Node Load(const std::string& input) {
@ -30,9 +30,9 @@ Node Load(std::istream& input) {
}
Node LoadFile(const std::string& filename) {
std::ifstream fin(filename.c_str());
if (!fin || fin.bad()) {
throw BadFile();
std::ifstream fin(filename);
if (!fin) {
throw BadFile(filename);
}
return Load(fin);
}
@ -51,7 +51,7 @@ std::vector<Node> LoadAll(std::istream& input) {
std::vector<Node> docs;
Parser parser(input);
while (1) {
while (true) {
NodeBuilder builder;
if (!parser.HandleNextDocument(builder)) {
break;
@ -63,9 +63,9 @@ std::vector<Node> LoadAll(std::istream& input) {
}
std::vector<Node> LoadAllFromFile(const std::string& filename) {
std::ifstream fin(filename.c_str());
std::ifstream fin(filename);
if (!fin) {
throw BadFile();
throw BadFile(filename);
}
return LoadAll(fin);
}

View File

@ -11,15 +11,13 @@
namespace YAML {
class EventHandler;
Parser::Parser() {}
Parser::Parser() : m_pScanner{}, m_pDirectives{} {}
Parser::Parser(std::istream& in) { Load(in); }
Parser::Parser(std::istream& in) : Parser() { Load(in); }
Parser::~Parser() {}
Parser::~Parser() = default;
Parser::operator bool() const {
return m_pScanner.get() && !m_pScanner->empty();
}
Parser::operator bool() const { return m_pScanner && !m_pScanner->empty(); }
void Parser::Load(std::istream& in) {
m_pScanner.reset(new Scanner(in));
@ -27,7 +25,7 @@ void Parser::Load(std::istream& in) {
}
bool Parser::HandleNextDocument(EventHandler& eventHandler) {
if (!m_pScanner.get())
if (!m_pScanner)
return false;
ParseDirectives();
@ -43,11 +41,7 @@ bool Parser::HandleNextDocument(EventHandler& eventHandler) {
void Parser::ParseDirectives() {
bool readDirective = false;
while (1) {
if (m_pScanner->empty()) {
break;
}
while (!m_pScanner->empty()) {
Token& token = m_pScanner->peek();
if (token.type != Token::DIRECTIVE) {
break;
@ -113,17 +107,13 @@ void Parser::HandleTagDirective(const Token& token) {
}
void Parser::PrintTokens(std::ostream& out) {
if (!m_pScanner.get()) {
if (!m_pScanner) {
return;
}
while (1) {
if (m_pScanner->empty()) {
break;
}
while (!m_pScanner->empty()) {
out << m_pScanner->peek() << "\n";
m_pScanner->pop();
}
}
}
} // namespace YAML

View File

@ -12,15 +12,17 @@
#include <memory>
#include <vector>
#include "yaml-cpp/noncopyable.h"
namespace YAML {
// TODO: This class is no longer needed
template <typename T>
class ptr_vector : private YAML::noncopyable {
class ptr_vector {
public:
ptr_vector() {}
ptr_vector() : m_data{} {}
ptr_vector(const ptr_vector&) = delete;
ptr_vector(ptr_vector&&) = default;
ptr_vector& operator=(const ptr_vector&) = delete;
ptr_vector& operator=(ptr_vector&&) = default;
void clear() { m_data.clear(); }
@ -38,6 +40,6 @@ class ptr_vector : private YAML::noncopyable {
private:
std::vector<std::unique_ptr<T>> m_data;
};
}
} // namespace YAML
#endif // PTR_VECTOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -2,18 +2,16 @@
namespace YAML {
// constructors
RegEx::RegEx() : m_op(REGEX_EMPTY) {}
RegEx::RegEx(REGEX_OP op) : m_op(op) {}
RegEx::RegEx(REGEX_OP op) : m_op(op), m_a(0), m_z(0), m_params{} {}
RegEx::RegEx() : RegEx(REGEX_EMPTY) {}
RegEx::RegEx(char ch) : m_op(REGEX_MATCH), m_a(ch) {}
RegEx::RegEx(char ch) : m_op(REGEX_MATCH), m_a(ch), m_z(0), m_params{} {}
RegEx::RegEx(char a, char z) : m_op(REGEX_RANGE), m_a(a), m_z(z) {}
RegEx::RegEx(char a, char z) : m_op(REGEX_RANGE), m_a(a), m_z(z), m_params{} {}
RegEx::RegEx(const std::string& str, REGEX_OP op) : m_op(op) {
for (std::size_t i = 0; i < str.size(); i++)
m_params.push_back(RegEx(str[i]));
}
RegEx::RegEx(const std::string& str, REGEX_OP op)
: m_op(op), m_a(0), m_z(0), m_params(str.begin(), str.end()) {}
// combination constructors
RegEx operator!(const RegEx& ex) {
@ -22,14 +20,14 @@ RegEx operator!(const RegEx& ex) {
return ret;
}
RegEx operator||(const RegEx& ex1, const RegEx& ex2) {
RegEx operator|(const RegEx& ex1, const RegEx& ex2) {
RegEx ret(REGEX_OR);
ret.m_params.push_back(ex1);
ret.m_params.push_back(ex2);
return ret;
}
RegEx operator&&(const RegEx& ex1, const RegEx& ex2) {
RegEx operator&(const RegEx& ex1, const RegEx& ex2) {
RegEx ret(REGEX_AND);
ret.m_params.push_back(ex1);
ret.m_params.push_back(ex2);
@ -42,4 +40,4 @@ RegEx operator+(const RegEx& ex1, const RegEx& ex2) {
ret.m_params.push_back(ex2);
return ret;
}
}
} // namespace YAML

View File

@ -31,14 +31,14 @@ enum REGEX_OP {
class YAML_CPP_API RegEx {
public:
RegEx();
RegEx(char ch);
explicit RegEx(char ch);
RegEx(char a, char z);
RegEx(const std::string& str, REGEX_OP op = REGEX_SEQ);
~RegEx() {}
~RegEx() = default;
friend YAML_CPP_API RegEx operator!(const RegEx& ex);
friend YAML_CPP_API RegEx operator||(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator&&(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator|(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator&(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator+(const RegEx& ex1, const RegEx& ex2);
bool Matches(char ch) const;
@ -53,7 +53,7 @@ class YAML_CPP_API RegEx {
int Match(const Source& source) const;
private:
RegEx(REGEX_OP op);
explicit RegEx(REGEX_OP op);
template <typename Source>
bool IsValidSource(const Source& source) const;
@ -77,10 +77,11 @@ class YAML_CPP_API RegEx {
private:
REGEX_OP m_op;
char m_a, m_z;
char m_a{};
char m_z{};
std::vector<RegEx> m_params;
};
}
} // namespace YAML
#include "regeximpl.h"

View File

@ -8,8 +8,8 @@
#endif
#include "stream.h"
#include "stringsource.h"
#include "streamcharsource.h"
#include "stringsource.h"
namespace YAML {
// query matches
@ -106,9 +106,8 @@ inline int RegEx::MatchOpEmpty(const Source& source) const {
template <>
inline int RegEx::MatchOpEmpty<StringCharSource>(
const StringCharSource& source) const {
return !source
? 0
: -1; // the empty regex only is successful on the empty string
return !source ? 0 : -1; // the empty regex only is successful on the empty
// string
}
// MatchOperator
@ -130,8 +129,8 @@ inline int RegEx::MatchOpRange(const Source& source) const {
// OrOperator
template <typename Source>
inline int RegEx::MatchOpOr(const Source& source) const {
for (std::size_t i = 0; i < m_params.size(); i++) {
int n = m_params[i].MatchUnchecked(source);
for (const RegEx& param : m_params) {
int n = param.MatchUnchecked(source);
if (n >= 0)
return n;
}
@ -169,11 +168,11 @@ inline int RegEx::MatchOpNot(const Source& source) const {
template <typename Source>
inline int RegEx::MatchOpSeq(const Source& source) const {
int offset = 0;
for (std::size_t i = 0; i < m_params.size(); i++) {
int n = m_params[i].Match(source + offset); // note Match, not
// MatchUnchecked because we
// need to check validity after
// the offset
for (const RegEx& param : m_params) {
int n = param.Match(source + offset); // note Match, not
// MatchUnchecked because we
// need to check validity after
// the offset
if (n == -1)
return -1;
offset += n;
@ -181,6 +180,6 @@ inline int RegEx::MatchOpSeq(const Source& source) const {
return offset;
}
}
} // namespace YAML
#endif // REGEXIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -9,12 +9,17 @@
namespace YAML {
Scanner::Scanner(std::istream& in)
: INPUT(in),
m_tokens{},
m_startedStream(false),
m_endedStream(false),
m_simpleKeyAllowed(false),
m_canBeJSONFlow(false) {}
m_canBeJSONFlow(false),
m_simpleKeys{},
m_indents{},
m_indentRefs{},
m_flows{} {}
Scanner::~Scanner() {}
Scanner::~Scanner() = default;
bool Scanner::empty() {
EnsureTokensInQueue();
@ -46,7 +51,7 @@ Token& Scanner::peek() {
Mark Scanner::mark() const { return INPUT.mark(); }
void Scanner::EnsureTokensInQueue() {
while (1) {
while (true) {
if (!m_tokens.empty()) {
Token& token = m_tokens.front();
@ -83,7 +88,7 @@ void Scanner::ScanNextToken() {
return StartStream();
}
// get rid of whitespace, etc. (in between tokens it should be irrelevent)
// get rid of whitespace, etc. (in between tokens it should be irrelevant)
ScanToNextToken();
// maybe need to end some blocks
@ -169,7 +174,7 @@ void Scanner::ScanNextToken() {
}
void Scanner::ScanToNextToken() {
while (1) {
while (true) {
// first eat whitespace
while (INPUT && IsWhitespaceToBeEaten(INPUT.peek())) {
if (InBlockContext() && Exp::Tab().Matches(INPUT)) {
@ -282,7 +287,7 @@ Scanner::IndentMarker* Scanner::PushIndentTo(int column,
IndentMarker::INDENT_TYPE type) {
// are we in flow?
if (InFlowContext()) {
return 0;
return nullptr;
}
std::unique_ptr<IndentMarker> pIndent(new IndentMarker(column, type));
@ -291,12 +296,12 @@ Scanner::IndentMarker* Scanner::PushIndentTo(int column,
// is this actually an indentation?
if (indent.column < lastIndent.column) {
return 0;
return nullptr;
}
if (indent.column == lastIndent.column &&
!(indent.type == IndentMarker::SEQ &&
lastIndent.type == IndentMarker::MAP)) {
return 0;
return nullptr;
}
// push a start token

View File

@ -9,9 +9,7 @@
#include <cstddef>
#include <ios>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
@ -49,7 +47,7 @@ class Scanner {
enum INDENT_TYPE { MAP, SEQ, NONE };
enum STATUS { VALID, INVALID, UNKNOWN };
IndentMarker(int column_, INDENT_TYPE type_)
: column(column_), type(type_), status(VALID), pStartToken(0) {}
: column(column_), type(type_), status(VALID), pStartToken(nullptr) {}
int column;
INDENT_TYPE type;

View File

@ -47,7 +47,8 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
if (INPUT.column() == 0 && Exp::DocIndicator().Matches(INPUT)) {
if (params.onDocIndicator == BREAK) {
break;
} else if (params.onDocIndicator == THROW) {
}
if (params.onDocIndicator == THROW) {
throw ParserException(INPUT.mark(), ErrorMsg::DOC_IN_SCALAR);
}
}
@ -183,7 +184,7 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
case FOLD_FLOW:
if (nextEmptyLine) {
scalar += "\n";
} else if (!emptyLine && !nextEmptyLine && !escapedNewline) {
} else if (!emptyLine && !escapedNewline) {
scalar += " ";
}
break;
@ -203,7 +204,7 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
// post-processing
if (params.trimTrailingSpaces) {
std::size_t pos = scalar.find_last_not_of(' ');
std::size_t pos = scalar.find_last_not_of(" \t");
if (lastEscapedChar != std::string::npos) {
if (pos < lastEscapedChar || pos == std::string::npos) {
pos = lastEscapedChar;
@ -247,4 +248,4 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
return scalar;
}
}
} // namespace YAML

View File

@ -57,7 +57,7 @@ struct ScanScalarParams {
bool leadingSpaces;
};
std::string ScanScalar(Stream& INPUT, ScanScalarParams& info);
std::string ScanScalar(Stream& INPUT, ScanScalarParams& params);
}
#endif // SCANSCALAR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -78,4 +78,4 @@ const std::string ScanTagSuffix(Stream& INPUT) {
return tag;
}
}
} // namespace YAML

View File

@ -37,7 +37,7 @@ void Scanner::ScanDirective() {
token.value += INPUT.get();
// read parameters
while (1) {
while (true) {
// first get rid of whitespace
while (Exp::Blank().Matches(INPUT))
INPUT.eat(1);
@ -171,7 +171,7 @@ void Scanner::ScanBlockEntry() {
// Key
void Scanner::ScanKey() {
// handle keys diffently in the block context (and manage indents)
// handle keys differently in the block context (and manage indents)
if (InBlockContext()) {
if (!m_simpleKeyAllowed)
throw ParserException(INPUT.mark(), ErrorMsg::MAP_KEY);
@ -199,7 +199,7 @@ void Scanner::ScanValue() {
// seems fine)
m_simpleKeyAllowed = false;
} else {
// handle values diffently in the block context (and manage indents)
// handle values differently in the block context (and manage indents)
if (InBlockContext()) {
if (!m_simpleKeyAllowed)
throw ParserException(INPUT.mark(), ErrorMsg::MAP_VALUE);
@ -338,7 +338,7 @@ void Scanner::ScanQuotedScalar() {
// setup the scanning parameters
ScanScalarParams params;
RegEx end = (single ? RegEx(quote) && !Exp::EscSingleQuote() : RegEx(quote));
RegEx end = (single ? RegEx(quote) & !Exp::EscSingleQuote() : RegEx(quote));
params.end = &end;
params.eatEnd = true;
params.escape = (single ? '\'' : '\\');
@ -434,4 +434,4 @@ void Scanner::ScanBlockScalar() {
token.value = scalar;
m_tokens.push(token);
}
}
} // namespace YAML

View File

@ -7,17 +7,24 @@
#pragma once
#endif
#include "yaml-cpp/noexcept.h"
#include <memory>
#include <utility>
#include <vector>
#include "yaml-cpp/noncopyable.h"
namespace YAML {
class SettingChangeBase;
class SettingChangeBase {
public:
virtual ~SettingChangeBase() = default;
virtual void pop() = 0;
};
template <typename T>
class Setting {
public:
Setting() : m_value() {}
Setting(const T& value) : m_value() { set(value); }
const T get() const { return m_value; }
std::unique_ptr<SettingChangeBase> set(const T& value);
@ -27,21 +34,19 @@ class Setting {
T m_value;
};
class SettingChangeBase {
public:
virtual ~SettingChangeBase() {}
virtual void pop() = 0;
};
template <typename T>
class SettingChange : public SettingChangeBase {
public:
SettingChange(Setting<T>* pSetting) : m_pCurSetting(pSetting) {
// copy old setting to save its state
m_oldSetting = *pSetting;
}
SettingChange(Setting<T>* pSetting)
: m_pCurSetting(pSetting),
m_oldSetting(*pSetting) // copy old setting to save its state
{}
SettingChange(const SettingChange&) = delete;
SettingChange(SettingChange&&) = delete;
SettingChange& operator=(const SettingChange&) = delete;
SettingChange& operator=(SettingChange&&) = delete;
virtual void pop() { m_pCurSetting->restore(m_oldSetting); }
void pop() override { m_pCurSetting->restore(m_oldSetting); }
private:
Setting<T>* m_pCurSetting;
@ -55,28 +60,13 @@ inline std::unique_ptr<SettingChangeBase> Setting<T>::set(const T& value) {
return pChange;
}
class SettingChanges : private noncopyable {
class SettingChanges {
public:
SettingChanges() {}
~SettingChanges() { clear(); }
void clear() {
restore();
m_settingChanges.clear();
}
void restore() {
for (setting_changes::const_iterator it = m_settingChanges.begin();
it != m_settingChanges.end(); ++it)
(*it)->pop();
}
void push(std::unique_ptr<SettingChangeBase> pSettingChange) {
m_settingChanges.push_back(std::move(pSettingChange));
}
// like std::unique_ptr - assignment is transfer of ownership
SettingChanges& operator=(SettingChanges&& rhs) {
SettingChanges() : m_settingChanges{} {}
SettingChanges(const SettingChanges&) = delete;
SettingChanges(SettingChanges&&) YAML_CPP_NOEXCEPT = default;
SettingChanges& operator=(const SettingChanges&) = delete;
SettingChanges& operator=(SettingChanges&& rhs) YAML_CPP_NOEXCEPT {
if (this == &rhs)
return *this;
@ -85,11 +75,26 @@ class SettingChanges : private noncopyable {
return *this;
}
~SettingChanges() { clear(); }
void clear() YAML_CPP_NOEXCEPT {
restore();
m_settingChanges.clear();
}
void restore() YAML_CPP_NOEXCEPT {
for (const auto& setting : m_settingChanges)
setting->pop();
}
void push(std::unique_ptr<SettingChangeBase> pSettingChange) {
m_settingChanges.push_back(std::move(pSettingChange));
}
private:
typedef std::vector<std::unique_ptr<SettingChangeBase>> setting_changes;
using setting_changes = std::vector<std::unique_ptr<SettingChangeBase>>;
setting_changes m_settingChanges;
};
}
} // namespace YAML
#endif // SETTING_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -5,7 +5,11 @@ namespace YAML {
struct Mark;
Scanner::SimpleKey::SimpleKey(const Mark& mark_, std::size_t flowLevel_)
: mark(mark_), flowLevel(flowLevel_), pIndent(0), pMapStart(0), pKey(0) {}
: mark(mark_),
flowLevel(flowLevel_),
pIndent(nullptr),
pMapStart(nullptr),
pKey(nullptr) {}
void Scanner::SimpleKey::Validate() {
// Note: pIndent will *not* be garbage here;
@ -125,4 +129,4 @@ void Scanner::PopAllSimpleKeys() {
while (!m_simpleKeys.empty())
m_simpleKeys.pop();
}
}
} // namespace YAML

View File

@ -7,6 +7,7 @@
#include "singledocparser.h"
#include "tag.h"
#include "token.h"
#include "yaml-cpp/depthguard.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/eventhandler.h"
#include "yaml-cpp/exceptions.h" // IWYU pragma: keep
@ -18,9 +19,10 @@ SingleDocParser::SingleDocParser(Scanner& scanner, const Directives& directives)
: m_scanner(scanner),
m_directives(directives),
m_pCollectionStack(new CollectionStack),
m_anchors{},
m_curAnchor(0) {}
SingleDocParser::~SingleDocParser() {}
SingleDocParser::~SingleDocParser() = default;
// HandleDocument
// . Handles the next document
@ -46,6 +48,8 @@ void SingleDocParser::HandleDocument(EventHandler& eventHandler) {
}
void SingleDocParser::HandleNode(EventHandler& eventHandler) {
DepthGuard<500> depthguard(depth, m_scanner.mark(), ErrorMsg::BAD_FILE);
// an empty node *is* a possibility
if (m_scanner.empty()) {
eventHandler.OnNull(m_scanner.mark(), NullAnchor);
@ -71,20 +75,31 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) {
}
std::string tag;
std::string anchor_name;
anchor_t anchor;
ParseProperties(tag, anchor);
ParseProperties(tag, anchor, anchor_name);
const Token& token = m_scanner.peek();
if (!anchor_name.empty())
eventHandler.OnAnchor(mark, anchor_name);
if (token.type == Token::PLAIN_SCALAR && IsNullString(token.value)) {
// after parsing properties, an empty node is again a possibility
if (m_scanner.empty()) {
eventHandler.OnNull(mark, anchor);
m_scanner.pop();
return;
}
const Token& token = m_scanner.peek();
// add non-specific tags
if (tag.empty())
tag = (token.type == Token::NON_PLAIN_SCALAR ? "!" : "?");
if (token.type == Token::PLAIN_SCALAR
&& tag.compare("?") == 0 && IsNullString(token.value)) {
eventHandler.OnNull(mark, anchor);
m_scanner.pop();
return;
}
// now split based on what kind of node we should be
switch (token.type) {
@ -152,7 +167,7 @@ void SingleDocParser::HandleBlockSequence(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::BlockSeq);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_SEQ);
@ -166,10 +181,10 @@ void SingleDocParser::HandleBlockSequence(EventHandler& eventHandler) {
// check for null
if (!m_scanner.empty()) {
const Token& token_ = m_scanner.peek();
if (token_.type == Token::BLOCK_ENTRY ||
token_.type == Token::BLOCK_SEQ_END) {
eventHandler.OnNull(token_.mark, NullAnchor);
const Token& nextToken = m_scanner.peek();
if (nextToken.type == Token::BLOCK_ENTRY ||
nextToken.type == Token::BLOCK_SEQ_END) {
eventHandler.OnNull(nextToken.mark, NullAnchor);
continue;
}
}
@ -185,7 +200,7 @@ void SingleDocParser::HandleFlowSequence(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::FlowSeq);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_SEQ_FLOW);
@ -238,7 +253,7 @@ void SingleDocParser::HandleBlockMap(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::BlockMap);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_MAP);
@ -277,7 +292,7 @@ void SingleDocParser::HandleFlowMap(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::FlowMap);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_MAP_FLOW);
@ -356,11 +371,13 @@ void SingleDocParser::HandleCompactMapWithNoKey(EventHandler& eventHandler) {
// ParseProperties
// . Grabs any tag or anchor tokens and deals with them.
void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) {
void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor,
std::string& anchor_name) {
tag.clear();
anchor_name.clear();
anchor = NullAnchor;
while (1) {
while (true) {
if (m_scanner.empty())
return;
@ -369,7 +386,7 @@ void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) {
ParseTag(tag);
break;
case Token::ANCHOR:
ParseAnchor(anchor);
ParseAnchor(anchor, anchor_name);
break;
default:
return;
@ -387,11 +404,12 @@ void SingleDocParser::ParseTag(std::string& tag) {
m_scanner.pop();
}
void SingleDocParser::ParseAnchor(anchor_t& anchor) {
void SingleDocParser::ParseAnchor(anchor_t& anchor, std::string& anchor_name) {
Token& token = m_scanner.peek();
if (anchor)
throw ParserException(token.mark, ErrorMsg::MULTIPLE_ANCHORS);
anchor_name = token.value;
anchor = RegisterAnchor(token.value);
m_scanner.pop();
}
@ -405,10 +423,13 @@ anchor_t SingleDocParser::RegisterAnchor(const std::string& name) {
anchor_t SingleDocParser::LookupAnchor(const Mark& mark,
const std::string& name) const {
Anchors::const_iterator it = m_anchors.find(name);
if (it == m_anchors.end())
throw ParserException(mark, ErrorMsg::UNKNOWN_ANCHOR);
auto it = m_anchors.find(name);
if (it == m_anchors.end()) {
std::stringstream ss;
ss << ErrorMsg::UNKNOWN_ANCHOR << name;
throw ParserException(mark, ss.str());
}
return it->second;
}
}
} // namespace YAML

View File

@ -12,10 +12,10 @@
#include <string>
#include "yaml-cpp/anchor.h"
#include "yaml-cpp/noncopyable.h"
namespace YAML {
class CollectionStack;
template <int> class DepthGuard; // depthguard.h
class EventHandler;
class Node;
class Scanner;
@ -23,9 +23,13 @@ struct Directives;
struct Mark;
struct Token;
class SingleDocParser : private noncopyable {
class SingleDocParser {
public:
SingleDocParser(Scanner& scanner, const Directives& directives);
SingleDocParser(const SingleDocParser&) = delete;
SingleDocParser(SingleDocParser&&) = delete;
SingleDocParser& operator=(const SingleDocParser&) = delete;
SingleDocParser& operator=(SingleDocParser&&) = delete;
~SingleDocParser();
void HandleDocument(EventHandler& eventHandler);
@ -43,23 +47,25 @@ class SingleDocParser : private noncopyable {
void HandleCompactMap(EventHandler& eventHandler);
void HandleCompactMapWithNoKey(EventHandler& eventHandler);
void ParseProperties(std::string& tag, anchor_t& anchor);
void ParseProperties(std::string& tag, anchor_t& anchor,
std::string& anchor_name);
void ParseTag(std::string& tag);
void ParseAnchor(anchor_t& anchor);
void ParseAnchor(anchor_t& anchor, std::string& anchor_name);
anchor_t RegisterAnchor(const std::string& name);
anchor_t LookupAnchor(const Mark& mark, const std::string& name) const;
private:
int depth = 0;
Scanner& m_scanner;
const Directives& m_directives;
std::unique_ptr<CollectionStack> m_pCollectionStack;
typedef std::map<std::string, anchor_t> Anchors;
using Anchors = std::map<std::string, anchor_t>;
Anchors m_anchors;
anchor_t m_curAnchor;
};
}
} // namespace YAML
#endif // SINGLEDOCPARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -111,24 +111,15 @@ static UtfIntroState s_introTransitions[][uictMax] = {
static char s_introUngetCount[][uictMax] = {
// uict00, uictBB, uictBF, uictEF, uictFE, uictFF, uictAscii, uictOther
{0, 1, 1, 0, 0, 0, 0, 1},
{0, 2, 2, 2, 2, 2, 2, 2},
{3, 3, 3, 3, 0, 3, 3, 3},
{4, 4, 4, 4, 4, 0, 4, 4},
{1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
{2, 2, 2, 2, 2, 0, 2, 2},
{2, 2, 2, 2, 0, 2, 2, 2},
{0, 1, 1, 1, 1, 1, 1, 1},
{0, 2, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
{0, 2, 2, 2, 2, 2, 2, 2},
{0, 3, 3, 3, 3, 3, 3, 3},
{4, 4, 4, 4, 4, 4, 4, 4},
{2, 0, 2, 2, 2, 2, 2, 2},
{3, 3, 0, 3, 3, 3, 3, 3},
{1, 1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 0, 0, 0, 0, 1}, {0, 2, 2, 2, 2, 2, 2, 2},
{3, 3, 3, 3, 0, 3, 3, 3}, {4, 4, 4, 4, 4, 0, 4, 4},
{1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1},
{2, 2, 2, 2, 2, 0, 2, 2}, {2, 2, 2, 2, 0, 2, 2, 2},
{0, 1, 1, 1, 1, 1, 1, 1}, {0, 2, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1},
{0, 2, 2, 2, 2, 2, 2, 2}, {0, 3, 3, 3, 3, 3, 3, 3},
{4, 4, 4, 4, 4, 4, 4, 4}, {2, 0, 2, 2, 2, 2, 2, 2},
{3, 3, 0, 3, 3, 3, 3, 3}, {1, 1, 1, 1, 1, 1, 1, 1},
};
inline UtfIntroCharType IntroCharTypeOf(std::istream::int_type ch) {
@ -160,7 +151,8 @@ inline UtfIntroCharType IntroCharTypeOf(std::istream::int_type ch) {
inline char Utf8Adjust(unsigned long ch, unsigned char lead_bits,
unsigned char rshift) {
const unsigned char header = ((1 << lead_bits) - 1) << (8 - lead_bits);
const unsigned char header =
static_cast<unsigned char>(((1 << lead_bits) - 1) << (8 - lead_bits));
const unsigned char mask = (0xFF >> (lead_bits + 1));
return static_cast<char>(
static_cast<unsigned char>(header | ((ch >> rshift) & mask)));
@ -192,17 +184,20 @@ inline void QueueUnicodeCodepoint(std::deque<char>& q, unsigned long ch) {
Stream::Stream(std::istream& input)
: m_input(input),
m_mark{},
m_charSet{},
m_readahead{},
m_pPrefetched(new unsigned char[YAML_PREFETCH_SIZE]),
m_nPrefetchedAvailable(0),
m_nPrefetchedUsed(0) {
typedef std::istream::traits_type char_traits;
using char_traits = std::istream::traits_type;
if (!input)
return;
// Determine (or guess) the character-set by reading the BOM, if any. See
// the YAML specification for the determination algorithm.
char_traits::int_type intro[4];
char_traits::int_type intro[4]{};
int nIntroUsed = 0;
UtfIntroState state = uis_start;
for (; !s_introFinalState[state];) {
@ -279,9 +274,11 @@ char Stream::get() {
// . Extracts 'n' characters from the stream and updates our position
std::string Stream::get(int n) {
std::string ret;
ret.reserve(n);
for (int i = 0; i < n; i++)
ret += get();
if (n > 0) {
ret.reserve(static_cast<std::string::size_type>(n));
for (int i = 0; i < n; i++)
ret += get();
}
return ret;
}
@ -332,7 +329,7 @@ bool Stream::_ReadAheadTo(size_t i) const {
void Stream::StreamInUtf8() const {
unsigned char b = GetNextByte();
if (m_input.good()) {
m_readahead.push_back(b);
m_readahead.push_back(static_cast<char>(b));
}
}
@ -353,7 +350,9 @@ void Stream::StreamInUtf16() const {
// Trailing (low) surrogate...ugh, wrong order
QueueUnicodeCodepoint(m_readahead, CP_REPLACEMENT_CHARACTER);
return;
} else if (ch >= 0xD800 && ch < 0xDC00) {
}
if (ch >= 0xD800 && ch < 0xDC00) {
// ch is a leading (high) surrogate
// Four byte UTF-8 code point
@ -378,11 +377,10 @@ void Stream::StreamInUtf16() const {
// Easiest case: queue the codepoint and return
QueueUnicodeCodepoint(m_readahead, ch);
return;
} else {
// Start the loop over with the new high surrogate
ch = chLow;
continue;
}
// Start the loop over with the new high surrogate
ch = chLow;
continue;
}
// Select the payload bits from the high surrogate
@ -445,4 +443,4 @@ void Stream::StreamInUtf32() const {
QueueUnicodeCodepoint(m_readahead, ch);
}
}
} // namespace YAML

View File

@ -7,7 +7,6 @@
#pragma once
#endif
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/mark.h"
#include <cstddef>
#include <deque>
@ -17,11 +16,18 @@
#include <string>
namespace YAML {
class Stream : private noncopyable {
class StreamCharSource;
class Stream {
public:
friend class StreamCharSource;
Stream(std::istream& input);
Stream(const Stream&) = delete;
Stream(Stream&&) = delete;
Stream& operator=(const Stream&) = delete;
Stream& operator=(Stream&&) = delete;
~Stream();
operator bool() const;
@ -71,6 +77,6 @@ inline bool Stream::ReadAheadTo(size_t i) const {
return true;
return _ReadAheadTo(i);
}
}
} // namespace YAML
#endif // STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -7,16 +7,20 @@
#pragma once
#endif
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/noexcept.h"
#include "stream.h"
#include <cstddef>
namespace YAML {
class StreamCharSource {
public:
StreamCharSource(const Stream& stream) : m_offset(0), m_stream(stream) {}
StreamCharSource(const StreamCharSource& source)
: m_offset(source.m_offset), m_stream(source.m_stream) {}
~StreamCharSource() {}
StreamCharSource(const StreamCharSource& source) = default;
StreamCharSource(StreamCharSource&&) YAML_CPP_NOEXCEPT = default;
StreamCharSource& operator=(const StreamCharSource&) = delete;
StreamCharSource& operator=(StreamCharSource&&) = delete;
~StreamCharSource() = default;
operator bool() const;
char operator[](std::size_t i) const { return m_stream.CharAt(m_offset + i); }
@ -27,8 +31,6 @@ class StreamCharSource {
private:
std::size_t m_offset;
const Stream& m_stream;
StreamCharSource& operator=(const StreamCharSource&); // non-assignable
};
inline StreamCharSource::operator bool() const {
@ -38,11 +40,11 @@ inline StreamCharSource::operator bool() const {
inline const StreamCharSource StreamCharSource::operator+(int i) const {
StreamCharSource source(*this);
if (static_cast<int>(source.m_offset) + i >= 0)
source.m_offset += i;
source.m_offset += static_cast<std::size_t>(i);
else
source.m_offset = 0;
return source;
}
}
} // namespace YAML
#endif // STREAMCHARSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -6,7 +6,8 @@
#include "token.h"
namespace YAML {
Tag::Tag(const Token& token) : type(static_cast<TYPE>(token.data)) {
Tag::Tag(const Token& token)
: type(static_cast<TYPE>(token.data)), handle{}, value{} {
switch (type) {
case VERBATIM:
value = token.value;
@ -28,7 +29,7 @@ Tag::Tag(const Token& token) : type(static_cast<TYPE>(token.data)) {
}
}
const std::string Tag::Translate(const Directives& directives) {
std::string Tag::Translate(const Directives& directives) {
switch (type) {
case VERBATIM:
return value;
@ -46,4 +47,4 @@ const std::string Tag::Translate(const Directives& directives) {
}
throw std::runtime_error("yaml-cpp: internal error, bad tag type");
}
}
} // namespace YAML

View File

@ -23,7 +23,7 @@ struct Tag {
};
Tag(const Token& token);
const std::string Translate(const Directives& directives);
std::string Translate(const Directives& directives);
TYPE type;
std::string handle, value;

View File

@ -14,10 +14,11 @@
namespace YAML {
const std::string TokenNames[] = {
"DIRECTIVE", "DOC_START", "DOC_END", "BLOCK_SEQ_START", "BLOCK_MAP_START",
"BLOCK_SEQ_END", "BLOCK_MAP_END", "BLOCK_ENTRY", "FLOW_SEQ_START",
"FLOW_MAP_START", "FLOW_SEQ_END", "FLOW_MAP_END", "FLOW_MAP_COMPACT",
"FLOW_ENTRY", "KEY", "VALUE", "ANCHOR", "ALIAS", "TAG", "SCALAR"};
"DIRECTIVE", "DOC_START", "DOC_END", "BLOCK_SEQ_START",
"BLOCK_MAP_START", "BLOCK_SEQ_END", "BLOCK_MAP_END", "BLOCK_ENTRY",
"FLOW_SEQ_START", "FLOW_MAP_START", "FLOW_SEQ_END", "FLOW_MAP_END",
"FLOW_MAP_COMPACT", "FLOW_ENTRY", "KEY", "VALUE",
"ANCHOR", "ALIAS", "TAG", "SCALAR"};
struct Token {
// enums
@ -48,12 +49,12 @@ struct Token {
// data
Token(TYPE type_, const Mark& mark_)
: status(VALID), type(type_), mark(mark_), data(0) {}
: status(VALID), type(type_), mark(mark_), value{}, params{}, data(0) {}
friend std::ostream& operator<<(std::ostream& out, const Token& token) {
out << TokenNames[token.type] << std::string(": ") << token.value;
for (std::size_t i = 0; i < token.params.size(); i++)
out << std::string(" ") << token.params[i];
for (const std::string& param : token.params)
out << std::string(" ") << param;
return out;
}
@ -64,6 +65,6 @@ struct Token {
std::vector<std::string> params;
int data;
};
}
} // namespace YAML
#endif // TOKEN_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -95,8 +95,9 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -107,8 +108,9 @@
</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -120,8 +122,9 @@
<SDLCheck>
</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -137,8 +140,9 @@
<SDLCheck>
</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -174,6 +178,7 @@
<ClCompile Include="src\contrib\graphbuilder.cpp" />
<ClCompile Include="src\contrib\graphbuilderadapter.cpp" />
<ClCompile Include="src\convert.cpp" />
<ClCompile Include="src\depthguard.cpp" />
<ClCompile Include="src\directives.cpp" />
<ClCompile Include="src\emit.cpp" />
<ClCompile Include="src\emitfromevents.cpp" />

View File

@ -89,6 +89,9 @@
<ClCompile Include="src\convert.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\depthguard.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\directives.cpp">
<Filter>Source Files</Filter>
</ClCompile>

View File

@ -35,7 +35,7 @@ project( rAthena )
if( CYGWIN )
unset( WIN32 )
endif()
set(CMAKE_CXX_STANDARD 11) # C++11...
set(CMAKE_CXX_STANDARD 17) # C++17...
set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required...
#set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11
@ -236,7 +236,7 @@ option( ENABLE_WEB_SERVER "Build web-server (default=ON)" ON )
#
TEST_BIG_ENDIAN( BIG_ENDIAN )
if( NOT DEFINED BIG_ENDIAN )
message( WARNING "unable to determine endianess, only LITTLE ENDIAN is supported" )
message( WARNING "unable to determine endianness, only LITTLE ENDIAN is supported" )
elseif( BIG_ENDIAN )
message( FATAL_ERROR "bigendian is not supported" )
endif()
@ -309,6 +309,17 @@ if( ENABLE_EXTRA_DEBUG_CODE )
endif()
#
# Enable EPOLL (default=OFF)
# Only for Linux
#
option( ENABLE_EXTRA_SOCKET_POLL "enable SOCKET_EPOLL (default=OFF)" OFF )
if( ENABLE_EXTRA_SOCKET_POLL )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DSOCKET_EPOLL" )
message( STATUS "Enabled SOCKET_EPOLL" )
endif()
#
# Enable builtin memory manager (default=default)
#

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