-- Credits: -- A. M. "MystikFox" -- "Mangler" version = getVersion(); if( version < 96 ) then printf("ERROR! You are using an old version of MicroMacro that is not compatable with this script.\n"); printf("Please download a newer version from http://solarimpact.servegame.com\n"); return; end; ------------------------- -- do NOT edit these!! CLASS_KNIGHT = 0; CLASS_CLERIC = 1; CLASS_MAGE = 2; CLASS_ARCHER = 3; -- EDIT THESE! ------------------------- class = CLASS_CLERIC; -- class determins the logic to take HP_restamt = 350; -- HP to rest at (not used for cleric's) HP_potion = 235; -- Use a HP potion (or heal skill for cleric) HP_stone = 180; -- Use a HP stone SP_restamt = 200; -- SP to rest at SP_potion = 300; -- Use a SP potion SP_stone = 240; -- Usa a SP stone key_attack = key.VK_1; -- normal melee attack key_pickup = key.VK_2; -- pickup items key_skill1 = key.VK_5; -- offensive and defensive spells... key_skill2 = key.VK_6; -- check your class's fight function key_skill3 = key.VK_7; -- for documentation on what each skill key_skill4 = key.VK_8; -- will be used for key_scroll1 = key.VK_9; -- offensive and defensive spells... key_scroll2 = key.VK_0; -- check your class's fight function key_scroll3 = key.VK_DASH; -- for documentation on what each skill key_scroll4 = key.VK_EQUAL; -- will be used for key_hppotion = key.VK_3; -- CLERICS: map this to your heal spell key_hpstone = key.VK_Q; key_sppotion = key.VK_4; key_spstone = key.VK_E; -- NOTE: if SP_potion is higher than SP_restatm, you will use SP potions -- instead of resting, unless you do not have any left. same goes for HP potions. -- you will always use potions while fighting if the values fall below -- the emergency amount. ------------------------- -- Scroll settings (read instructions below Buff settings first) ------------------------- scroll1_duration = 3500000; scroll_1 = 1; scroll2_duration = 3500000; scroll_2 = 1; scroll3_duration = 3500000; scroll_3 = 0; scroll4_duration = 3500000; scroll_4 = 0; ------------------------- -- Buff settings (only for clerics) ------------------------- buff1_duration = 3500000; buff_1 = 1; buff2_duration = 3500000; buff_2 = 1; buff3_duration = 3500000; buff_3 = 0; buff4_duration = 3500000; buff_4 = 0; -- NOTE: set on 59 minutes -- buff / scroll durations in msec time = minutes x 60000 -- to de- activate non used buffs / scrolls replace "1" with "0" -- to activate buff / scroll replace "0" with "1" -- scrolls can be used too as buff ------------------------- -- should not need to be changed, except for HP_addr/SP_addr when -- a patch makes them no longer work proc = 0; win = 0; HP_addr = "00758FE7"; HPmax_addr = "007590B8"; SP_addr = "00758FEB"; SPmax_addr = "007590BC"; restcheck_addr = "01F66B04"; HP = 10000; -- default, this corrects itself (don't change it!) HPmax = HP; -- default, this corrects itself (don't change it!) SP = 10000; -- default, this corrects itself (don't change it!) SPmax = SP; -- default, this corrects itself (don't change it!) buff1_needed = true; buff2_needed = true; buff3_needed = true; buff4_needed = true; scroll1_needed = true; scroll2_needed = true; scroll3_needed = true; scroll4_needed = true; need_heal = false; can_rest = true; ------------------------- function fight_timer() keyboardHold(key_attack); yrest(50); keyboardRelease(key_attack); end -- fighting functions ----------------------------------------------------- -- fight as a knight function knight_fight() -- skill1 : offensive skill -- skill2 : offensive skill -- skill3 : offensive skill -- skill4 : offensive skill keyboardHold(key_attack); yrest(50); keyboardRelease(key_attack); registerTimer("fight_timer", 3000, fight_timer); while(have_target()) do if( HP < HP_potion) then hp_potion(); end if( HP < HP_stone) then hp_stone(); end if( SP < SP_potion) then sp_potion(); end if( SP < SP_stone) then hp_stone(); end keyboardHold(key_attack); yrest(50); keyboardRelease(key_attack); if( math.random(100) > 92 ) then if( math.random(100) >= 50 ) then keyboardHold(key_skill1); yrest(50); keyboardRelease(key_skill1); else keyboardHold(key_skill2); yrest(50); keyboardRelease(key_skill2); end end yrest(200); end unregisterTimer("fight_timer"); for i = 0,8 do pickup(); yrest(50); end can_rest = false; registerTimer("can_rest_timer", 3000, can_rest_timer); end -- fight function for cleric function cleric_fight() -- skill1 : buff 1 -- skill2 : buff 2 -- skill3 : buff 3 -- skill4 : buff 4 keyboardHold(key_attack); yrest(50); keyboardRelease(key_attack); registerTimer("fight_timer", 3000, fight_timer); while(have_target()) do if( HP < HP_potion) then hp_potion(); end if( HP < HP_stone) then hp_stone(); end if( SP < SP_potion) then sp_potion(); end if( SP < SP_stone) then sp_stone(); end yrest(100); end unregisterTimer("fight_timer"); for i = 0,8 do pickup(); yrest(50); end can_rest = false; registerTimer("can_rest_timer", 3000, can_rest_timer); end -- fight as a mage function mage_fight() -- skill1 : offensive spell -- skill2 : offensive spell -- skill3 : offensive spell -- skill4 : offensive spell while(have_target()) do if( HP < HP_potion) then hp_potion(); end if( HP < HP_stone) then hp_stone(); end if( SP = 50 ) then keyboardHold(key_skill1); yrest(50); keyboardRelease(key_skill1); else keyboardHold(key_skill2); yrest(50); keyboardRelease(key_skill2); end yrest(500); keyboardHold(key_attack); yrest(50); keyboardRelease(key_attack); registerTimer("fight_timer", 3000, fight_timer); while(have_target()) do if( HP < HP_potion) then hp_potion(); end if( HP < HP_stone) then hp_stone(); end if( SP < SP_potion) then sp_potion(); end if( SP < SP_stone) then hp_stone(); end --keyboardHold(key_attack); --yrest(50); --keyboardRelease(key_attack); if( math.random(100) > 80 ) then if( math.random(100) >= 50 ) then keyboardHold(key_skill2); yrest(50); keyboardRelease(key_skill2); else keyboardHold(key_skill3); yrest(50); keyboardRelease(key_skill3); end yrest(200); end yrest(200); end unregisterTimer("fight_timer"); for i = 0,8 do pickup(); yrest(100); end can_rest = false; registerTimer("can_rest_timer", 3000, can_rest_timer); end ----------------------------------------------------- -- toggle cast needed for buff1 function buff1_timer() buff1_needed = true; end -- toggle cast needed for buff2 function buff2_timer() buff2_needed = true; end -- toggle cast needed for buff3 function buff3_timer() buff3_needed = true; end -- toggle cast needed for buff4 function buff4_timer() buff4_needed = true; end -- toggle cast needed for scroll1 function scroll1_timer() scroll1_needed = true; end -- toggle cast needed for scroll2 function scroll2_timer() scroll2_needed = true; end -- toggle cast needed for scroll3 function scroll3_timer() scroll3_needed = true; end -- toggle cast needed for scroll4 function scroll4_timer() scroll4_needed = true; end -- you have died! oh noes! function death_return() keyboardPress(key.VK_SNAPSHOT); print(os.date("Looks like somebody got you killed. %X")) print("A screen capture has been taken. Open MS Paint and paste it."); stopPE(); -- this turns the macro off! coroutine.yield(); -- yield to make sure the protected environment stops end -- moves forward a bit...makes you seem less bot-like. -- allows you to cover more ground function move_forward() keyboardHold(key.VK_W); if( math.random(100) >= 80 ) then keyboardHold(key.VK_A); else if( math.random(100) >= 80 ) then keyboardHold(key.VK_D); end end yrest( math.random(2000) ); keyboardRelease(key.VK_W); keyboardRelease(key.VK_A); keyboardRelease(key.VK_D); end -- rotate camera function rotate_cam() wx,wy = windowRect(win); mouseSet(wx+512, wy+384); yrest(100); mouseRHold(); yrest(100); mouseSet(wx+514, wy+384); yrest(100); mouseRRelease(); yrest(100); end -- pickup nearby items function pickup() keyboardHold(key_pickup); yrest(50); keyboardRelease(key_pickup); yrest(50); end -- selects a nearby monster function target_monster() keyboardHold(key.VK_TAB); yrest(50); keyboardRelease(key.VK_TAB); end -- checks if you have a target function have_target() local r,g,b = getPixel(hdc, 540, 1); -- check for the gray in the monster's HP window if( r >= 229 and r <= 240 and g >= 245 and g <= 255 and b >= 250 ) then return true; else return false; end end -- updates variables from client function update_vars() HP = memoryReadInt(proc, HP_addr); HPmax = memoryReadInt(proc, HPmax_addr); SP = memoryReadInt(proc, SP_addr); SPmax = memoryReadInt(proc, SPmax_addr); end -- toggle can_heal to true, disable timer function can_rest_timer() unregisterTimer("can_rest_timer"); can_rest = true; end -- rest untill healed function rest_heal() if( can_rest == false ) then return; end printf("Entering rest state\t%s\n", os.date("%X")); keyboardHold(key.VK_HOME); yrest(500); keyboardRelease(key.VK_HOME); need_heal = true; last_hp = HP; while( need_heal ) do yrest(100); if( HP == HPmax and SP == SPmax ) then need_heal = false; end; if (HP < last_hp) then print("Under attack! Exiting rest."); can_rest = false; registerTimer("can_rest_timer", 3000, can_rest_timer); break; else last_hp = HP; end end -- BROKEN!! IGNORE THIS! --while( 1 ) do -- keyboardHold(key.VK_HOME); -- yrest(500); -- keyboardRelease(key.VK_HOME); -- -- yrest(500); -- local val = memoryReadByte(proc, restcheck_addr); -- printf("Rest check val: %d\n", val); -- -- if( val ~= 1 ) then -- 1 = resting, 2 = standing -- break; end; -- so if not resting, exit --end printf("Exiting rest state\t%s\n", os.date("%X")); end -- use a hp potion! function hp_potion() keyboardHold(key_hppotion); yrest(100); keyboardRelease(key_hppotion); yrest(500); end -- use a hp stone! function hp_stone() keyboardHold(key_hpstone); yrest(100); keyboardRelease(key_hpstone); print("HP stone used.") yrest(500); end -- use a sp potion! function sp_potion() keyboardHold(key_sppotion); yrest(100); keyboardRelease(key_sppotion); yrest(500); end -- use a sp stone! function sp_stone() keyboardHold(key_spstone); yrest(100); keyboardRelease(key_spstone); print("SP stone used.") yrest(500); end function main() win = findWindow("FiestaOnline"); local wx,wy,ww,wh = windowRect(win); if( ww ~= 1024 or wh ~= 768 ) then printf("Error! You must run Fiesta in 1024*768 resolution.\n"); return; end; if( win == 0 ) then printf("Error! Could not locate Fiesta window!\n"); return; end; hdc = openDC(win); proc = openProcess( findProcess("FiestaOnline") ); attach(win); registerTimer("update_vars", 100, update_vars); if( class == CLASS_CLERIC ) then registerTimer("buff1_timer", buff1_duration, buff1_timer); registerTimer("buff2_timer", buff2_duration, buff2_timer); registerTimer("buff3_timer", buff3_duration, buff3_timer); registerTimer("buff4_timer", buff4_duration, buff4_timer); end registerTimer("scroll1_timer", scroll1_duration, scroll1_timer); registerTimer("scroll2_timer", scroll2_duration, scroll2_timer); registerTimer("scroll3_timer", scroll3_duration, scroll3_timer); registerTimer("scroll4_timer", scroll4_duration, scroll4_timer); while( 1 ) do if( HP == 0 ) then death_return(); end if( HP < HP_potion ) then hp_potion(); end if( HP < HP_stone ) then hp_stone(); end if( SP < SP_potion ) then sp_potion(); end if( SP < SP_stone ) then sp_stone(); end if( HP < HP_restamt and can_rest == true ) then rest_heal(); end if( SP < SP_restamt and can_rest == true ) then rest_heal(); end yrest(100); target_monster(); yrest(200); if( have_target() ) then can_rest = false; -- prevent resting during battle -- for the few that have this bug if( class == CLASS_KNIGHT ) then knight_fight(); end if( class == CLASS_CLERIC ) then cleric_fight(); end if( class == CLASS_MAGE ) then mage_fight(); end if( class == CLASS_ARCHER ) then archer_fight(); end can_rest = true; else -- cleric only logic if( class == CLASS_CLERIC ) then if( buff_1 == 1 ) then if( buff1_needed ) then keyboardHold(key_skill1); yrest(100); keyboardRelease(key_skill1); print(os.date("buff 1 casted %X")) buff1_needed = false; yrest(2000); end end if( buff_2 == 1 ) then if( buff2_needed ) then keyboardHold(key_skill2); yrest(100); keyboardRelease(key_skill2); print(os.date("buff 2 casted %X")) buff2_needed = false; yrest(2000); end end if( buff_3 == 1 ) then if( buff3_needed ) then keyboardHold(key_skill3); yrest(100); keyboardRelease(key_skill3); print(os.date("buff 3 casted %X")) buff3_needed = false; yrest(2000); end end if( buff_4 == 1 ) then if( buff4_needed ) then keyboardHold(key_skill4); yrest(100); keyboardRelease(key_skill4); print(os.date("buff 4 casted %X")) buff4_needed = false; yrest(2000); end end end if( scroll_1 == 1 ) then if( scroll1_needed ) then keyboardHold(key_scroll1); yrest(100); keyboardRelease(key_scroll1); print(os.date("scroll 1 used %X")) scroll1_needed = false; yrest(3200); end end if( scroll_2 == 1 ) then if( scroll2_needed ) then keyboardHold(key_scroll2); yrest(100); keyboardRelease(key_scroll2); print(os.date("scroll 2 used %X")) scroll2_needed = false; yrest(3200); end end if( scroll_3 == 1 ) then if( scroll3_needed ) then keyboardHold(key_scroll3); yrest(100); keyboardRelease(key_scroll3); print(os.date("scroll 3 used %X")) scroll3_needed = false; yrest(3200); end end if( scroll_4 == 1 ) then if( scroll4_needed ) then keyboardHold(key_scroll4); yrest(100); keyboardRelease(key_scroll4); print(os.date("scroll 4 used %X")) scroll4_needed = false; yrest(3200); end end rotate_cam(); if( math.random(100) > 90 ) then move_forward(); end end pickup(); end detach(); closeProcess(proc); end startMacro(main);