Browse Source

* Replaced INF2_NO_AUTOSHADOWSPELL with INF2_AUTOSHADOWSPELL following AEGIS standard, reverted c9cf222.
* Fixed bugreport:8596 http://rathena.org/board/tracker/issue-8596-compile-warnings-with-fresh-svn/
* Removed temporary array while parsing shop NPC, makes remove the limit 100 items each NPC
* Added idRO cash trader according to Chinese New Year event

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>

Cydh Ramdh 11 years ago
parent
commit
b4bdaebeeb
9 changed files with 151 additions and 105 deletions
  1. 21 21
      db/pre-re/skill_db.txt
  2. 26 26
      db/re/skill_db.txt
  3. 10 4
      npc/re/merchants/cash_trader-idRO.txt
  4. 3 6
      src/map/clif.c
  5. 22 15
      src/map/npc.c
  6. 2 2
      src/map/npc.h
  7. 1 1
      src/map/pc.c
  8. 65 29
      src/map/skill.c
  9. 1 1
      src/map/skill.h

+ 21 - 21
db/pre-re/skill_db.txt

@@ -36,7 +36,7 @@
 //    0x00400- usable only on party-members (and enemies if skill is offensive)
 //    0x00800- usable only on guild-mates (and enemies if skill is offensive)
 //    0x01000- disable usage on enemies (for non-offensive skills).
-//    0x02000- free
+//    0x02000- available skill for SC_AUTOSHADOWSPELL
 //    0x04000- chorus skill
 //    0x08000- spell that ignore bg reduction
 //    0x10000- spell that ignore gvg reduction
@@ -80,17 +80,17 @@
 // Mage
 9,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x20,		MG_SRECOVERY,Increase SP Recovery
 10,0,6,4,3,0x3,3,1,1,yes,0,0,0,magic,0,0x20,		MG_SIGHT,Sight
-11,9,6,1,8,0x6,1,10,1,yes,0,0,0,magic,0,0x20,		MG_NAPALMBEAT,Napalm Beat
+11,9,6,1,8,0x6,1,10,1,yes,0,0x2000,0,magic,0,0x20,		MG_NAPALMBEAT,Napalm Beat
 12,9,8,2,8,0x1,0,10,1,yes,0,0,0,magic,0,0x20,		MG_SAFETYWALL,Safety Wall
-13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0,0x20,		MG_SOULSTRIKE,Soul Strike
-14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_COLDBOLT,Cold Bolt
-15,9,6,1,1,0,0,10,1,yes,0,0,0,magic,0,0x20,		MG_FROSTDIVER,Frost Diver
+13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0x2000,0,magic,0,0x20,		MG_SOULSTRIKE,Soul Strike
+14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_COLDBOLT,Cold Bolt
+15,9,6,1,1,0,0,10,1,yes,0,0x2000,0,magic,0,0x20,		MG_FROSTDIVER,Frost Diver
 16,2,6,1,2,0x1,0,10,1,yes,0,0,0,magic,0,0x20,		MG_STONECURSE,Stone Curse
-17,9,6,1,3,0x2,2,10,1,yes,0,0,0,magic,0,0x20,		MG_FIREBALL,Fire Ball
-18,9,6,2,3,0,0,10,1,yes,0,0,3,magic,2,0x20,		MG_FIREWALL,Fire Wall
-19,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_FIREBOLT,Fire Bolt
-20,9,8,1,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_LIGHTNINGBOLT,Lightning Bolt
-21,9,8,2,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_THUNDERSTORM,Thunderstorm
+17,9,6,1,3,0x2,2,10,1,yes,0,0x2000,0,magic,0,0x20,		MG_FIREBALL,Fire Ball
+18,9,6,2,3,0,0,10,1,yes,0,0x2000,3,magic,2,0x20,		MG_FIREWALL,Fire Wall
+19,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_FIREBOLT,Fire Bolt
+20,9,8,1,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_LIGHTNINGBOLT,Lightning Bolt
+21,9,8,2,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_THUNDERSTORM,Thunderstorm
 
 //****
 // Acolyte
@@ -100,7 +100,7 @@
 25,9,6,2,0,0x1,0,1,1,yes,0,0,0,magic,0,0x20,		AL_PNEUMA,Pneuma
 26,0,6,4,0,0x1,0,2,1,yes,0,0,0,magic,0,0x60,		AL_TELEPORT,Teleport
 27,9,6,2,0,0x1,0,4,1,yes,0,0,3,magic,0,0x20,		AL_WARP,Warp Portal
-28,9,6,16,6,0x21,0,10,1,yes,0,0,0,magic,0,0x20,	AL_HEAL,Heal
+28,9,6,16,6,0x21,0,10,1,yes,0,0x2000,0,magic,0,0x20,	AL_HEAL,Heal
 29,9,6,16,0,0x1,0,10,1,yes,0,0,0,magic,0,0x1020,	AL_INCAGI,Increase AGI
 30,9,6,1,0,0x1,0,10,1,yes,0,0,0,magic,0,0x0,		AL_DECAGI,Decrease AGI
 31,0,6,4,0,0x1,0,1,1,yes,0,0,0,magic,0,0x20,		AL_HOLYWATER,Aqua Benedicta
@@ -171,17 +171,17 @@
 
 //****
 // Wizard
-80,9,8,2,3,0x20,1:1:1:1:1:2:2:2:2:2:2,10,3:4:5:6:7:8:9:10:11:12:12,yes,0,0x80,5,magic,0,0x0,	WZ_FIREPILLAR,Fire Pillar
-81,0,6,4,3,0,3,10,1,yes,0,0,0,magic,5,0x20,		WZ_SIGHTRASHER,Sightrasher
-83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0,0,magic,0,0x20,	WZ_METEOR,Meteor Storm
-84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,2:3:3:4:4:5:5:6:6:7,0x20,	WZ_JUPITEL,Jupitel Thunder
-85,9,8,2,4,0,0,10,-10,yes,0,0,0,magic,0,0x20,		WZ_VERMILION,Lord of Vermilion
-86,9,8,1,1,0,0,5,1,yes,0,0,0,magic,0,0x0,		WZ_WATERBALL,Water Ball
+80,9,8,2,3,0x20,1:1:1:1:1:2:2:2:2:2:2,10,3:4:5:6:7:8:9:10:11:12:12,yes,0,0x2080,5,magic,0,0x0,	WZ_FIREPILLAR,Fire Pillar
+81,0,6,4,3,0,3,10,1,yes,0,0x2000,0,magic,5,0x20,		WZ_SIGHTRASHER,Sightrasher
+83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0x2000,0,magic,0,0x20,	WZ_METEOR,Meteor Storm
+84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0x2000,0,magic,2:3:3:4:4:5:5:6:6:7,0x20,	WZ_JUPITEL,Jupitel Thunder
+85,9,8,2,4,0,0,10,-10,yes,0,0x2000,0,magic,0,0x20,		WZ_VERMILION,Lord of Vermilion
+86,9,8,1,1,0,0,5,1,yes,0,0x2000,0,magic,0,0x0,		WZ_WATERBALL,Water Ball
 87,9,6,2,1,0x1,0,10,1,yes,0,0,0,magic,0,0x20,		WZ_ICEWALL,Ice Wall
-88,0,6,4,1,0x2,2,10,1,yes,0,0,0,magic,0,0x0,		WZ_FROSTNOVA,Frost Nova
-89,9,6,2,1,0,0,10,1,yes,0,0,0,magic,2,0x20,		WZ_STORMGUST,Storm Gust
-90,9,8,1,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0,0x20,	WZ_EARTHSPIKE,Earth Spike
-91,9,8,2,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0,0x20,	WZ_HEAVENDRIVE,Heaven's Drive
+88,0,6,4,1,0x2,2,10,1,yes,0,0x2000,0,magic,0,0x0,		WZ_FROSTNOVA,Frost Nova
+89,9,6,2,1,0,0,10,1,yes,0,0x2000,0,magic,2,0x20,		WZ_STORMGUST,Storm Gust
+90,9,8,1,2,0,0,5,1:2:3:4:5,yes,0,0x2000,0,magic,0,0x20,	WZ_EARTHSPIKE,Earth Spike
+91,9,8,2,2,0,0,5,1:2:3:4:5,yes,0,0x2000,0,magic,0,0x20,	WZ_HEAVENDRIVE,Heaven's Drive
 92,9,6,2,2,0x1,0,5,1,yes,0,0,3,magic,0,0x20,		WZ_QUAGMIRE,Quagmire
 93,9,6,1,0,0x1,0,1,1,yes,0,0,0,magic,0,0x0,		WZ_ESTIMATION,Sense
 

+ 26 - 26
db/re/skill_db.txt

@@ -36,7 +36,7 @@
 //    0x00400- usable only on party-members (and enemies if skill is offensive)
 //    0x00800- usable only on guild-mates (and enemies if skill is offensive)
 //    0x01000- disable usage on enemies (for non-offensive skills).
-//    0x02000- skill cannot be auto casted by Auto Shadow Spell
+//    0x02000- available skill for SC_AUTOSHADOWSPELL
 //    0x04000- chorus skill
 //    0x08000- spell that ignore bg reduction
 //    0x10000- spell that ignore gvg reduction
@@ -80,27 +80,27 @@
 // Mage
 9,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x20,		MG_SRECOVERY,Increase SP Recovery
 10,0,6,4,3,0x3,3,1,1,yes,0,0,0,magic,0,0x20,		MG_SIGHT,Sight
-11,9,6,1,8,0x6,1,10,1,yes,0,0,0,magic,0,0x20,		MG_NAPALMBEAT,Napalm Beat
+11,9,6,1,8,0x6,1,10,1,yes,0,0x2000,0,magic,0,0x20,		MG_NAPALMBEAT,Napalm Beat
 12,9,8,2,8,0x1,0,10,1,yes,0,0,0,magic,0,0x20,		MG_SAFETYWALL,Safety Wall
-13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0,0x20,		MG_SOULSTRIKE,Soul Strike
-14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_COLDBOLT,Cold Bolt
-15,9,6,1,1,0,0,10,1,yes,0,0,0,magic,0,0x20,		MG_FROSTDIVER,Frost Diver
+13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0x2000,0,magic,0,0x20,		MG_SOULSTRIKE,Soul Strike
+14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_COLDBOLT,Cold Bolt
+15,9,6,1,1,0,0,10,1,yes,0,0x2000,0,magic,0,0x20,		MG_FROSTDIVER,Frost Diver
 16,2,6,1,2,0x1,0,10,1,yes,0,0,0,magic,0,0x20,		MG_STONECURSE,Stone Curse
-17,9,6,1,3,0x2,2,10,1,yes,0,0,0,magic,0,0x20,		MG_FIREBALL,Fire Ball
-18,9,6,2,3,0,0,10,1,yes,0,0,3,magic,2,0x20,		MG_FIREWALL,Fire Wall
-19,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_FIREBOLT,Fire Bolt
-20,9,8,1,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_LIGHTNINGBOLT,Lightning Bolt
-21,9,8,2,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0,0x20,	MG_THUNDERSTORM,Thunderstorm
+17,9,6,1,3,0x2,2,10,1,yes,0,0x2000,0,magic,0,0x20,		MG_FIREBALL,Fire Ball
+18,9,6,2,3,0,0,10,1,yes,0,0x2000,3,magic,2,0x20,		MG_FIREWALL,Fire Wall
+19,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_FIREBOLT,Fire Bolt
+20,9,8,1,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_LIGHTNINGBOLT,Lightning Bolt
+21,9,8,2,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	MG_THUNDERSTORM,Thunderstorm
 
 //****
 // Acolyte
 22,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0,		AL_DP,Divine Protection
 23,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0,		AL_DEMONBANE,Demon Bane
-24,0,6,4,6,0x3,2,1,1,yes,0,0x2000,0,magic,0,0x20,		AL_RUWACH,Ruwach
+24,0,6,4,6,0x3,2,1,1,yes,0,0x0,0,magic,0,0x20,		AL_RUWACH,Ruwach
 25,9,6,2,0,0x1,0,1,1,yes,0,0,0,magic,0,0x20,		AL_PNEUMA,Pneuma
 26,0,6,4,0,0x1,0,2,1,yes,0,0,0,magic,0,0x60,		AL_TELEPORT,Teleport
 27,9,6,2,0,0x1,0,4,1,yes,0,0,3,magic,0,0x20,		AL_WARP,Warp Portal
-28,9,6,16,6,0x21,0,10,1,yes,0,0,0,magic,0,0x20,	AL_HEAL,Heal
+28,9,6,16,6,0x21,0,10,1,yes,0,0x2000,0,magic,0,0x20,	AL_HEAL,Heal
 29,9,6,16,0,0x1,0,10,1,yes,0,0,0,magic,0,0x20,	AL_INCAGI,Increase AGI
 30,9,6,1,0,0x1,0,10,1,yes,0,0,0,magic,0,0x0,		AL_DECAGI,Decrease AGI
 31,0,6,4,0,0x1,0,1,1,yes,0,0,0,magic,0,0x20,		AL_HOLYWATER,Aqua Benedicta
@@ -165,23 +165,23 @@
 74,0,6,4,0,0x3,-1,5,1,yes,0,0,0,magic,0,0x20,		PR_MAGNIFICAT,Magnificat
 75,0,6,4,0,0x3,-1,5,1,yes,0,0,0,magic,0,0x0,		PR_GLORIA,Gloria
 76,5,6,1,0,0x1,0,10,0,yes,0,0,0,magic,0,0x20,	PR_LEXDIVINA,Lex Divina
-77,5,6,1,6,0x28,0,10,1,yes,0,0x2000,0,magic,0,0x20,	PR_TURNUNDEAD,Turn Undead
+77,5,6,1,6,0x28,0,10,1,yes,0,0x0,0,magic,0,0x20,	PR_TURNUNDEAD,Turn Undead
 78,9,6,1,0,0x1,0,1,0,yes,0,0,0,magic,0,0x20,		PR_LEXAETERNA,Lex Aeterna
-79,9,8,2,6,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x2000,0,magic,0,0x20,	PR_MAGNUS,Magnus Exorcismus
+79,9,8,2,6,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0x0,0,magic,0,0x20,	PR_MAGNUS,Magnus Exorcismus
 
 //****
 // Wizard
-80,9,8,2,3,0x20,1:1:1:1:1:2:2:2:2:2:2,10,3:4:5:6:7:8:9:10:11:12:12,yes,0,0x80,5,magic,0,0x0,	WZ_FIREPILLAR,Fire Pillar
-81,0,6,4,3,0,3,10,1,yes,0,0,0,magic,5,0x20,		WZ_SIGHTRASHER,Sightrasher
-83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0,0,magic,0,0x20,	WZ_METEOR,Meteor Storm
-84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,2:3:3:4:4:5:5:6:6:7,0x20,	WZ_JUPITEL,Jupitel Thunder
-85,9,8,2,4,0,0,10,-10,yes,0,0,0,magic,0,0x20,		WZ_VERMILION,Lord of Vermilion
-86,9,8,1,1,0,0,5,1,yes,0,0,0,magic,0,0x0,		WZ_WATERBALL,Water Ball
+80,9,8,2,3,0x20,1:1:1:1:1:2:2:2:2:2:2,10,3:4:5:6:7:8:9:10:11:12:12,yes,0,0x2080,5,magic,0,0x0,	WZ_FIREPILLAR,Fire Pillar
+81,0,6,4,3,0,3,10,1,yes,0,0x2000,0,magic,5,0x20,		WZ_SIGHTRASHER,Sightrasher
+83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0x2000,0,magic,0,0x20,	WZ_METEOR,Meteor Storm
+84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0x2000,0,magic,2:3:3:4:4:5:5:6:6:7,0x20,	WZ_JUPITEL,Jupitel Thunder
+85,9,8,2,4,0,0,10,-10,yes,0,0x2000,0,magic,0,0x20,		WZ_VERMILION,Lord of Vermilion
+86,9,8,1,1,0,0,5,1,yes,0,0x2000,0,magic,0,0x0,		WZ_WATERBALL,Water Ball
 87,9,6,2,1,0x1,0,10,1,yes,0,0,0,magic,0,0x20,		WZ_ICEWALL,Ice Wall
-88,0,6,4,1,0x2,2,10,1,yes,0,0,0,magic,0,0x0,	WZ_FROSTNOVA,Frost Nova
-89,9,6,2,1,0,0,10,1,yes,0,0,0,magic,2,0x20,		WZ_STORMGUST,Storm Gust
-90,9,8,1,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0,0x20,	WZ_EARTHSPIKE,Earth Spike
-91,9,8,2,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0,0x20,	WZ_HEAVENDRIVE,Heaven's Drive
+88,0,6,4,1,0x2,2,10,1,yes,0,0x2000,0,magic,0,0x0,	WZ_FROSTNOVA,Frost Nova
+89,9,6,2,1,0,0,10,1,yes,0,0x2000,0,magic,2,0x20,		WZ_STORMGUST,Storm Gust
+90,9,8,1,2,0,0,5,1:2:3:4:5,yes,0,0x2000,0,magic,0,0x20,	WZ_EARTHSPIKE,Earth Spike
+91,9,8,2,2,0,0,5,1:2:3:4:5,yes,0,0x2000,0,magic,0,0x20,	WZ_HEAVENDRIVE,Heaven's Drive
 92,9,6,2,2,0x1,0,5,1,yes,0,0,3,magic,0,0x20,		WZ_QUAGMIRE,Quagmire
 93,9,6,1,0,0x1,0,1,1,yes,0,0,0,magic,0,0x0,		WZ_ESTIMATION,Sense
 
@@ -258,7 +258,7 @@
 153,1,6,1,-1,0x2,1,1,1,no,0,0x1,0,weapon,2,0x0,	MC_CARTREVOLUTION,Cart Revolution
 154,0,6,4,0,0x1,0,1,1,no,0,0x1,0,none,0,0x0,		MC_CHANGECART,Change Cart
 155,0,6,4,0,0x1,0,1,1,no,0,0x1,0,weapon,0,0x0,	MC_LOUD,Crazy Uproar
-156,9,6,1,6,0,0,1,1,yes,0,0x2001,0,magic,0,0x20,		AL_HOLYLIGHT,Holy Light
+156,9,6,1,6,0,0,1,1,yes,0,0x1,0,magic,0,0x20,		AL_HOLYLIGHT,Holy Light
 157,0,6,4,0,0x1,0,1,1,yes,0,0x1,0,magic,0,0x20,	MG_ENERGYCOAT,Energy Coat
 
 //****
@@ -368,7 +368,7 @@
 251,3:5:7:9:11,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x0,	CR_SHIELDBOOMERANG,Shield Boomerang
 252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0,0x0,		CR_REFLECTSHIELD,Shield Reflect
 253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0,0x0,	CR_HOLYCROSS,Holy Cross
-254,5,6,4,6,0x48,0,10,1,no,33,0x2100,0,magic,0,0x0,	CR_GRANDCROSS,Grand Cross
+254,5,6,4,6,0x48,0,10,1,no,33,0x100,0,magic,0,0x0,	CR_GRANDCROSS,Grand Cross
 255,7:8:9:10:11,6,16,0,0x1,0,5,1,yes,0,0x600,0,none,0,0x0,	CR_DEVOTION,Sacrifice
 256,9,6,16,0,0x1,0,5,1,yes,0,0x200,0,none,0,0x0,	CR_PROVIDENCE,Resistant Souls
 257,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0,0x0,		CR_DEFENDER,Defending Aura

+ 10 - 4
npc/re/merchants/cash_trader-idRO.txt

@@ -3,18 +3,18 @@
 //===== By: ================================================== 
 //= Cydh
 //===== Current Version: ===================================== 
-//= 1.1
+//= 1.2
 //===== Compatible With: ===================================== 
 //= rAthena Project
 //===== Description: ========================================= 
-//= Sell Cash shop items based on idRO's Cash shop.
+//= Sell Cash shop items based on idRO's Cash shop
 //===== Additional Comments: ================================= 
 //= 1.0 Initial release. 2014-Jan-13 [Cydh]
-//      - Put/enable all 'idRO misc items' from db/import/item_db.txt, or put from db/import-tmpl/item_db.txt
-//      - Change MAX_SHOPITEM (on npc.c) to 210 then recompile your server (some NPCs sell more than 100 items)
 //= 1.1 2014-Jan-18 [Cydh]
 //      - Fixed the item list
 //      - Added NPC placement for some maps
+//= 1.2 2014-Feb-4 [Cydh]
+//      - Added Cash Trader with special offer for Chinese New Year
 //============================================================
 
 //============================================================
@@ -349,3 +349,9 @@ rachel,100,135,3	duplicate(idRO_eq2)	Equipment 2#ra	80
 rachel,100,131,3	duplicate(idRO_acc)	Acc and Kartu#ra	721
 rachel,100,133,3	duplicate(idRO_acc2)	Acc and Kartu 2#ra	80
 rachel,95,131,3	duplicate(idRO_rental)	Rental Shop#ra	874
+
+//===========================================================
+//Special Prices of Chinese New Year 2014
+//===========================================================
+-	cashshop	idROC2014::idRO_C2014	721,2936:6250,2177:6250,18574:6250,6225:7500,6226:5625,5381:7500,5210:10000,5294:6250,5463:6250,5335:6250,5256:6250,5495:6250,18630:6250,19518:6250,19519:6250,19520:6250,2573:6250,15058:6250,5490:6250,5498:6250,5253:6250,5502:6250,5526:6250,5529:6250,19509:6250,5359:7500,18729:6250,18666:6250,5284:6250,5471:6250,5467:6250,5363:6250,5546:6250,5334:6250,1472:5000,13420:6250,1392:5000,15008:6250,1731:3750,1825:2500,1261:1875,5545:6250,5550:6250,5549:6250,5515:6250,5514:6250,5470:6250,5505:6250,18695:6250,18694:6250
+prontera,156,178,3	duplicate(idRO_C2014)	Kafra Shop#C2014_prt	721

+ 3 - 6
src/map/clif.c

@@ -16669,14 +16669,11 @@ int clif_autoshadowspell_list(struct map_session_data *sd) {
 
 	WFIFOHEAD(fd, 2 * 6 + 4);
 	WFIFOW(fd,0) = 0x442;
-	//- Only list the skill that 'imitated' and Magic skill
-	//- Cannot autocasted 3rd and extended skills
-	//- Some holy skills cannot be autocasted, marked as INF2_NO_AUTOSHADOWSPELL [Cydh]
-	//! NOTE: Maybe later can get rid of 'sd->status.skill[i].id < GS_GLITTERING' since there is INF2_NO_AUTOSHADOWSPELL
+	
+	//AEGIS listed the specified skills that available for SC_AUTOSHADOWSPELL
 	for( i = 0, c = 0; i < MAX_SKILL; i++ )
 		if( sd->status.skill[i].flag == SKILL_FLAG_PLAGIARIZED && sd->status.skill[i].id > 0 &&
-			sd->status.skill[i].id < GS_GLITTERING && skill_get_type(sd->status.skill[i].id) == BF_MAGIC &&
-			!(skill_get_inf2(sd->status.skill[i].id)&INF2_NO_AUTOSHADOWSPELL))
+			(skill_get_inf2(sd->status.skill[i].id)&INF2_AUTOSHADOWSPELL))
 		{
 			WFIFOW(fd,8+c*2) = sd->status.skill[i].id;
 			c++;

+ 22 - 15
src/map/npc.c

@@ -2318,11 +2318,8 @@ static const char* npc_parse_warp(char* w1, char* w2, char* w3, char* w4, const
  */
 static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const char* start, const char* buffer, const char* filepath)
 {
-	//TODO: could be rewritten to NOT need this temp array [ultramage]
-	#define MAX_SHOPITEM 100
-	struct npc_item_list items[MAX_SHOPITEM];
 	char *p, point_str[32];
-	int x, y, dir, m, i, nameid = 0, is_discount = 0;
+	int x, y, dir, m, nameid = 0, is_discount = 0;
 	struct npc_data *nd;
 	enum npc_subtype type;
 
@@ -2398,10 +2395,15 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
 			is_discount = 1;
 			break;
 	}
+	
+	CREATE(nd, struct npc_data, 1);
 
-	for( i = 0; i < ARRAYLENGTH(items) && p; ++i ) {
+	nd->u.shop.count = 0;
+	while ( p ) {
 		int nameid, value;
 		struct item_data* id;
+		if( p == NULL )
+			break;
 		if( sscanf(p, ",%d:%d", &nameid, &value) != 2 ) {
 			ShowError("npc_parse_shop: Invalid item definition in file '%s', line '%d'. Ignoring the rest of the line...\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer,start-buffer), w1, w2, w3, w4);
 			break;
@@ -2430,22 +2432,27 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
 		if( id->maxchance == 0 )
 			id->maxchance = -1; // -1 would show that the item's sold in NPC Shop
 
-		items[i].nameid = nameid;
-		items[i].value = value;
+		if (nd->u.shop.count > 0)
+			RECREATE(nd->u.shop.shop_item, struct npc_item_list,nd->u.shop.count+1);
+		else
+			CREATE(nd->u.shop.shop_item, struct npc_item_list,1);
+
+		nd->u.shop.shop_item[nd->u.shop.count].nameid = nameid;
+		nd->u.shop.shop_item[nd->u.shop.count].value = value;
+		nd->u.shop.count++;
 		p = strchr(p+1,',');
 	}
-	if( i == 0 ) {
+	if( nd->u.shop.count == 0 ) {
 		ShowWarning("npc_parse_shop: Ignoring empty shop in file '%s', line '%d'.\n", filepath, strline(buffer,start-buffer));
+		aFree(nd);
 		return strchr(start,'\n');// continue
 	}
 
-	CREATE(nd, struct npc_data, 1);
-	CREATE(nd->u.shop.shop_item, struct npc_item_list, i);
-	memcpy(nd->u.shop.shop_item, items, sizeof(struct npc_item_list)*i);
-	nd->u.shop.count = i;
-	nd->u.shop.itemshop_nameid = nameid; // Item shop currency
-	safestrncpy(nd->u.shop.pointshop_str,point_str,strlen(point_str)+1); // Point shop currency
-	nd->u.shop.discount = is_discount;
+	if (type != SHOP) {
+		if (type == ITEMSHOP) nd->u.shop.itemshop_nameid = nameid; // Item shop currency
+		else if (type == POINTSHOP) safestrncpy(nd->u.shop.pointshop_str,point_str,strlen(point_str)+1); // Point shop currency
+		nd->u.shop.discount = is_discount;
+	}
 	nd->bl.prev = nd->bl.next = NULL;
 	nd->bl.m = m;
 	nd->bl.x = x;

+ 2 - 2
src/map/npc.h

@@ -56,8 +56,8 @@ struct npc_data {
 			struct npc_label_list *label_list;
 		} scr;
 		struct {
-			struct npc_item_list* shop_item;
-			int count;
+			struct npc_item_list *shop_item;
+			uint16 count;
 			int itemshop_nameid; // Item Shop cost item ID
 			char pointshop_str[32]; // Point Shop cost variable name
 			bool discount;

+ 1 - 1
src/map/pc.c

@@ -743,7 +743,7 @@ bool pc_isequipped(struct map_session_data *sd, int nameid)
 
 	for( i = 0; i < EQI_MAX; i++ )
 	{
-		uint8 index = sd->equip_index[i], j;
+		int8 index = sd->equip_index[i], j;
 		if( index < 0 ) continue;
 
 		if( i == EQI_HAND_R && sd->equip_index[EQI_HAND_L] == index ) continue;

+ 65 - 29
src/map/skill.c

@@ -18898,8 +18898,10 @@ static bool skill_parse_row_requiredb(char* split[], int columns, int current)
 	return true;
 }
 
-static bool skill_parse_row_castdb(char* split[], int columns, int current)
-{// skill_id,CastingTime,AfterCastActDelay,AfterCastWalkDelay,Duration1,Duration2,Cooldown{,Fixedcast}
+/** Reads skill cast db
+* SkillID,CastingTime,AfterCastActDelay,AfterCastWalkDelay,Duration1,Duration2,Cooldown{,Fixedcast}
+*/
+static bool skill_parse_row_castdb(char* split[], int columns, int current) {
 	uint16 skill_id = atoi(split[0]);
 	uint16 idx = skill_get_index(skill_id);
 	if( !idx ) // invalid skill id
@@ -18917,8 +18919,10 @@ static bool skill_parse_row_castdb(char* split[], int columns, int current)
 	return true;
 }
 
-static bool skill_parse_row_castnodexdb(char* split[], int columns, int current)
-{// Skill id,Cast,Delay (optional)
+/** Reads skill cast no dex db
+* SkillID,Cast,Delay (optional)
+*/
+static bool skill_parse_row_castnodexdb(char* split[], int columns, int current) {
 	uint16 skill_id = atoi(split[0]);
 	uint16 idx = skill_get_index(skill_id);
 	if( !idx ) // invalid skill id
@@ -18931,8 +18935,10 @@ static bool skill_parse_row_castnodexdb(char* split[], int columns, int current)
 	return true;
 }
 
-static bool skill_parse_row_nocastdb(char* split[], int columns, int current)
-{// skill_id,Flag
+/** Reads skill no cast db
+* SkillID,Flag
+*/
+static bool skill_parse_row_nocastdb(char* split[], int columns, int current) {
 	uint16 skill_id = atoi(split[0]);
 	uint16 idx = skill_get_index(skill_id);
 	if( !idx ) // invalid skill id
@@ -18943,8 +18949,10 @@ static bool skill_parse_row_nocastdb(char* split[], int columns, int current)
 	return true;
 }
 
-static bool skill_parse_row_unitdb(char* split[], int columns, int current)
-{// ID,unit ID,unit ID 2,layout,range,interval,target,flag
+/** Reads skill unit db
+* ID,unit ID,unit ID 2,layout,range,interval,target,flag
+*/
+static bool skill_parse_row_unitdb(char* split[], int columns, int current) {
 	uint16 skill_id = atoi(split[0]);
 	uint16 idx = skill_get_index(skill_id);
 	if( !idx ) // invalid skill id
@@ -18984,8 +18992,10 @@ static bool skill_parse_row_unitdb(char* split[], int columns, int current)
 	return true;
 }
 
-static bool skill_parse_row_producedb(char* split[], int columns, int current)
-{// ProduceItemID,ItemLV,RequireSkill,Requireskill_lv,MaterialID1,MaterialAmount1,......
+/** Reads Produce db
+* ProduceItemID,ItemLV,RequireSkill,Requireskill_lv,MaterialID1,MaterialAmount1,......
+*/
+static bool skill_parse_row_producedb(char* split[], int columns, int current) {
 	int x,y;
 
 	int i = atoi(split[0]);
@@ -19005,8 +19015,10 @@ static bool skill_parse_row_producedb(char* split[], int columns, int current)
 	return true;
 }
 
-static bool skill_parse_row_createarrowdb(char* split[], int columns, int current)
-{// SourceID,MakeID1,MakeAmount1,...,MakeID5,MakeAmount5
+/** Reads create arrow db
+* SourceID,MakeID1,MakeAmount1,...,MakeID5,MakeAmount5
+*/
+static bool skill_parse_row_createarrowdb(char* split[], int columns, int current) {
 	int x,y;
 
 	int i = atoi(split[0]);
@@ -19022,8 +19034,11 @@ static bool skill_parse_row_createarrowdb(char* split[], int columns, int curren
 
 	return true;
 }
-static bool skill_parse_row_spellbookdb(char* split[], int columns, int current)
-{// skill_id,PreservePoints
+
+/** Reads Spell book db
+* SkillID,PreservePoints
+*/
+static bool skill_parse_row_spellbookdb(char* split[], int columns, int current) {
 
 	uint16 skill_id = atoi(split[0]);
 	int points = atoi(split[1]);
@@ -19045,8 +19060,11 @@ static bool skill_parse_row_spellbookdb(char* split[], int columns, int current)
 
 	return false;
 }
-static bool skill_parse_row_improvisedb(char* split[], int columns, int current)
-{// SkillID,Rate
+
+/** Reads improvise db
+* SkillID,Rate
+*/
+static bool skill_parse_row_improvisedb(char* split[], int columns, int current) {
 	uint16 skill_id = atoi(split[0]);
 	short j = atoi(split[1]);
 
@@ -19070,8 +19088,11 @@ static bool skill_parse_row_improvisedb(char* split[], int columns, int current)
 
 	return true;
 }
-static bool skill_parse_row_magicmushroomdb(char* split[], int column, int current)
-{// SkillID
+
+/** Reads Magic mushroom db
+* SkillID
+*/
+static bool skill_parse_row_magicmushroomdb(char* split[], int column, int current) {
 	uint16 skill_id = atoi(split[0]);
 
 	if( !skill_get_index(skill_id) || !skill_get_max(skill_id) )
@@ -19090,6 +19111,10 @@ static bool skill_parse_row_magicmushroomdb(char* split[], int column, int curre
 	return true;
 }
 
+/** Reads db of copyable skill
+* SkillName,Option{,JobAllowed{,RequirementRemoved}}
+* SkillID,Option{,JobAllowed{,RequirementRemoved}}
+*/
 static bool skill_parse_row_copyabledb(char* split[], int column, int current) {
 	int16 id;
 	uint8 option;
@@ -19117,24 +19142,33 @@ static bool skill_parse_row_copyabledb(char* split[], int column, int current) {
 	return true;
 }
 
-/// Reads additional range [Cydh]
+/** Reads additional range for distance checking from NPC [Cydh]
+* SkillName,AdditionalRange{,NPC Type}
+* SkillID,AdditionalRange{,NPC Type}
+*/
 static bool skill_parse_row_nonearnpcrangedb(char* split[], int column, int current) {
-	int idx;
-	uint16 skill_id = skill_name2id(split[0]);
+	int16 id;
 
-	if ((idx = skill_get_index(skill_id)) < 0) { // invalid skill id
+	trim(split[0]);
+	if(ISDIGIT(split[0][0]))
+		id = atoi(split[0]);
+	else
+		id = skill_name2id(split[0]);
+
+	if ((id = skill_get_index(id)) < 0) { // invalid skill id
 		ShowError("skill_parse_row_nonearnpcrangedb: Invalid skill '%s'\n",split[0]);
 		return false;
 	}
 
-	skill_db[idx].unit_nonearnpc_range = max(atoi(split[1]),0);
-	skill_db[idx].unit_nonearnpc_type = (atoi(split[2])) ? cap_value(atoi(split[2]),1,15) : 15;
+	skill_db[id].unit_nonearnpc_range = max(atoi(split[1]),0);
+	skill_db[id].unit_nonearnpc_type = (atoi(split[2])) ? cap_value(atoi(split[2]),1,15) : 15;
 	return true;
 }
 
-
-static bool skill_parse_row_abradb(char* split[], int columns, int current)
-{// skill_id,DummyName,RatePerLvl
+/** Reads skill chance by Abracadabra/Hocus Pocus spell
+* SkillID,DummyName,RatePerLvl
+*/
+static bool skill_parse_row_abradb(char* split[], int columns, int current) {
 	uint16 skill_id = atoi(split[0]);
 	if( !skill_get_index(skill_id) || !skill_get_max(skill_id) )
 	{
@@ -19154,8 +19188,10 @@ static bool skill_parse_row_abradb(char* split[], int columns, int current)
 	return true;
 }
 
-static bool skill_parse_row_changematerialdb(char* split[], int columns, int current)
-{// ProductID,BaseRate,MakeAmount1,MakeAmountRate1...,MakeAmount5,MakeAmountRate5
+/** Reads change material db
+* ProductID,BaseRate,MakeAmount1,MakeAmountRate1...,MakeAmount5,MakeAmountRate5
+*/
+static bool skill_parse_row_changematerialdb(char* split[], int columns, int current) {
 	uint16 skill_id = atoi(split[0]);
 	short j = atoi(split[1]);
 	int x,y;

+ 1 - 1
src/map/skill.h

@@ -65,7 +65,7 @@ enum e_skill_inf2 {
 	INF2_PARTY_ONLY     = 0x00400,
 	INF2_GUILD_ONLY     = 0x00800,
 	INF2_NO_ENEMY       = 0x01000,
-	INF2_NO_AUTOSHADOWSPELL = 0x02000, // Skill that cannot be auto casted by Auto Shadow Spell
+	INF2_AUTOSHADOWSPELL = 0x02000, // Skill that available for SC_AUTOSHADOWSPELL
 	INF2_CHORUS_SKILL	= 0x04000, // Chorus skill
 	INF2_NO_BG_DMG		= 0x08000, // spell that ignore bg reduction
 	INF2_NO_GVG_DMG		= 0x10000, // spell that ignore gvg reduction