--phonics_tsalagi by bacon and Neuromancer and yona --License code and textures WTFPL --For now you can left click the blue blocks and they make phonics_tsalagi sounds and light up. --Start by placing the blue phonics_tsalagi blocks and left clicking on them to hear their sounds. They also light up. --Next place a "sound out word" block (the one with a mouth on it) and then build a word by placing the blue blocks next to it. --Left Click (punch) the mouth block to hear the word you built sounded out. --This mod has a long way to go: --Plan for enhancements (being worked on): --***TEST: punching a page start will not only blank the page, but reset the current_page_start so it can be written to again. --***put a limit on how far away page finish can be from page start on x and z axis. --Add a chat command allowing a teaching player to type in words that appear as phonics. That way the learning player must either --read what the teacher types in chat, or sound out the phonics_tsalagi blocks that appear above the teacher's head. Then it is just free play --in whatever peak's the learner's interest. --Chat command /ph will display a Sentence Block, plus what they typed with a sayWord block in front of every word. --if the sentence block is deleted, the whole sentence is deleted. --to display "ar" type a+r, to display long e, type "e_", to display silent e, type Se --Left Clicking (punching) on the mouth block left click says a word it wants you to spell --followed by sounding out what you have spelled to the right of it. --if what you have spelled matches one of the spellings for the mouth the block is looking for it makes a ---firework sound (eventually launching blocks into the air as fireworks) --if you have not spelled the word the mouth block is looking for, it makes a sad noise. --if you destroy mouth block, it destroys all letters to the right of it (explode or fire burn) --gray blocks are silent letters which are not sounded out -- this means we have to create sounds for words and an array of spellings for each word. --if you don't want a word and want a new word, just destroy the mouth block. --maybe have it spell out the correct answer if you put a show answer block on top of the mouth block. --if you place a word block, a word is automatically generated to the right of the word block and you are expected to read it. --you can click individual blocks to help you sound it out --you can also left click the word block to get the answer (it will sound out the word and then say the word.) --Create blocks with pictures of the thing that the word describes so that someone learning the language as a second language could also benefit. --someday have an NPC Tutor. --TODO: --punch scroll blanks the page again. --dig scroll deletes the page. --add tsalagi estern dialect local page_start local page_end local message_index phonics_tsalagi = { a={name="a", length=.4, gain=1, is_letter=1}, _a={name="_a", length=.5, gain=1, is_letter=0}, e={name="e", length=.65, gain=1, is_letter=1}, _e={name="_e", length=.64, gain=1, is_letter=0}, i={name="i", length=.65, gain=1, is_letter=1}, _i={name="_i", length=.45, gain=1, is_letter=0}, o={name="o", length=.65, gain=1, is_letter=0}, _o={name="_o", length=.65, gain=1, is_letter=0}, u={name="u", length=.65, gain=1, is_letter=1}, _u={name="_u", length=.92, gain=1, is_letter=0}, v={name="v", length=.65, gain=1, is_letter=1}, s={name="s", length=.92, gain=1, is_letter=1}, ga={name="ga", length=.90, gain=1, is_letter=0}, ka={name="ka", length=.90, gain=1, is_letter=0}, ge={name="ge", length=.90, gain=1, is_letter=0}, gi={name="gi", length=.90, gain=1, is_letter=1}, go={name="go", length=.90, gain=1, is_letter=0}, gu={name="gu", length=.90, gain=1, is_letter=0}, gv={name="gv", length=.90, gain=1, is_letter=0}, ha={name="ha", length=.90, gain=1, is_letter=0}, he={name="he", length=.90, gain=1, is_letter=0}, hi={name="hi", length=.90, gain=1, is_letter=0}, ho={name="ho", length=.90, gain=1, is_letter=0}, hu={name="hu", length=.90, gain=1, is_letter=0}, hv={name="hv", length=.90, gain=1, is_letter=0}, la={name="la", length=.90, gain=1, is_letter=0}, le={name="le", length=.90, gain=1, is_letter=0}, li={name="li", length=.90, gain=1, is_letter=0}, lo={name="lo", length=.90, gain=1, is_letter=0}, lu={name="lu", length=.90, gain=1, is_letter=0}, lv={name="lv", length=.90, gain=1, is_letter=0}, ma={name="ma", length=.90, gain=1, is_letter=0}, me={name="me", length=.90, gain=1, is_letter=0}, mi={name="mi", length=.90, gain=1, is_letter=0}, mo={name="mo", length=.90, gain=1, is_letter=0}, mu={name="mu", length=.90, gain=1, is_letter=0}, na={name="na", length=.90, gain=1, is_letter=0}, hna={name="hna", length=.90, gain=1, is_letter=0}, nah={name="nah", length=.90, gain=1, is_letter=0}, ne={name="ne", length=.90, gain=1, is_letter=0}, ni={name="ni", length=.90, gain=1, is_letter=0}, no={name="no", length=.90, gain=1, is_letter=0}, nu={name="nu", length=.90, gain=1, is_letter=0}, nv={name="nv", length=.90, gain=1, is_letter=0}, qua={name="qua", length=.90, gain=1, is_letter=0}, que={name="que", length=.90, gain=1, is_letter=0}, qui={name="qui", length=.90, gain=1, is_letter=0}, qwo={name="quo", length=.90, gain=1, is_letter=0}, quu={name="quu", length=.90, gain=1, is_letter=0}, quv={name="quv", length=.90, gain=1, is_letter=0}, sa={name="sa", length=.90, gain=1, is_letter=0}, se={name="se", length=.90, gain=1, is_letter=0}, si={name="si", length=.90, gain=1, is_letter=0}, so={name="so", length=.90, gain=1, is_letter=0}, su={name="su", length=.90, gain=1, is_letter=0}, sv={name="sv", length=.90, gain=1, is_letter=0}, da={name="da", length=.90, gain=1, is_letter=0}, ta={name="ta", length=.90, gain=1, is_letter=0}, de={name="de", length=.90, gain=1, is_letter=0}, te={name="te", length=.90, gain=1, is_letter=0}, di={name="di", length=.90, gain=1, is_letter=0}, ti={name="ti", length=.90, gain=1, is_letter=0}, ["do"]={name="do", length=.90, gain=1, is_letter=0}, du={name="du", length=.90, gain=1, is_letter=0}, dv={name="dv", length=.90, gain=1, is_letter=0}, dla={name="dla", length=.90, gain=1, is_letter=0}, tla={name="tla", length=.90, gain=1, is_letter=0}, tle={name="tle", length=.90, gain=1, is_letter=0}, tli={name="tli", length=.90, gain=1, is_letter=0}, tlo={name="tlo", length=.90, gain=1, is_letter=0}, tlu={name="tlu", length=.90, gain=1, is_letter=0}, tlv={name="tlv", length=.90, gain=1, is_letter=0}, tsa={name="tsa", length=.90, gain=1, is_letter=0}, tse={name="tse", length=.90, gain=1, is_letter=0}, tsi={name="tsi", length=.90, gain=1, is_letter=0}, tso={name="tso", length=.90, gain=1, is_letter=0}, tsu={name="tsu", length=.90, gain=1, is_letter=0}, tsv={name="tsv", length=.90, gain=1, is_letter=0}, wa={name="wa", length=.90, gain=1, is_letter=0}, we={name="we", length=.90, gain=1, is_letter=0}, wi={name="wi", length=.90, gain=1, is_letter=0}, wo={name="wo", length=.90, gain=1, is_letter=0}, wu={name="wu", length=.90, gain=1, is_letter=0}, wv={name="wv", length=.90, gain=1, is_letter=0}, ya={name="ya", length=.90, gain=1, is_letter=0}, ye={name="ye", length=.90, gain=1, is_letter=0}, yi={name="yi", length=.90, gain=1, is_letter=0}, yo={name="yo", length=.90, gain=1, is_letter=0}, yu={name="yu", length=.90, gain=1, is_letter=0}, yv={name="yv", length=.90, gain=1, is_letter=0}, } two_char_phonics_tsalagi = { ga= {name="ga"}, ka= {name="ka"}, ge= {name="ge"}, gi= {name="gi"}, go= {name="go"}, gu= {name="gu"}, gv= {name="gv"}, ha= {name="ha"}, he= {name="he"}, hi= {name="hi"}, ho= {name="ho"}, hu= {name="hu"}, hv= {name="hv"}, la= {name="la"}, le= {name="le"}, li= {name="li"}, lo= {name="lo"}, lu= {name="lu"}, lv= {name="lv"}, ma= {name="ma"}, me= {name="me"}, mi= {name="mi"}, mo= {name="mo"}, mu= {name="mu"}, na= {name="na"}, ne= {name="ne"}, ni= {name="ni"}, no= {name="no"}, nu= {name="nu"}, nv= {name="nv"}, sa= {name="sa"}, se= {name="se"}, si= {name="si"}, so= {name="so"}, su= {name="su"}, sv= {name="sv"}, da= {name="da"}, ta= {name="ta"}, de= {name="de"}, te= {name="te"}, di= {name="di"}, ti= {name="ti"}, ["do"]= {name="do"}, du= {name="du"}, dv= {name="dv"}, wa= {name="wa"}, we= {name="we"}, wi= {name="wi"}, wo= {name="wo"}, wu= {name="wu"}, wv= {name="wv"}, ya= {name="ya"}, ye= {name="ye"}, yi= {name="yi"}, yo= {name="yo"}, yu= {name="yu"}, yv= {name="yv"}, --wh= {name="wh"} } three_char_phonics_tsalagi = { hna= {name="hna"}, nah= {name="nah"}, qua= {name="qua"}, que= {name="que"}, qui= {name="qui"}, qwo= {name="quo"}, quu= {name="quu"}, quv= {name="quv"}, dla= {name="dla"}, tla= {name="tla"}, tle= {name="tle"}, tli= {name="tli"}, tlo= {name="tlo"}, tlu= {name="tlu"}, tlv= {name="tlv"}, tsa= {name="tsa"}, tse= {name="tse"}, tsi= {name="tsi"}, tso= {name="tso"}, tsu= {name="tsu"}, tsv= {name="tsv"}, } local words = { cat={spellings={ {c},{a},{t} } } } for key,value in pairs(phonics_tsalagi) do minetest.register_node("phonics_tsalagi:"..key, { description = key, tiles = {"phonics_tsalagi_"..key..".jpg"}, is_ground_content = true, groups = {cracky=3, choppy=3}, sounds = default.node_sound_stone_defaults(), on_punch = function(pos, node, puncher) -- minetest.chat_send_all("phonic.on_punch:" .. pos.x ..">" ) hit_with = puncher:get_wielded_item() wear=hit_with:get_wear() if wear == 0 then activate_node({pos, key, phonics_tsalagi[key].length}) end end, }) minetest.register_node("phonics_tsalagi:"..key.."_active", { description = key.."_active", tiles = {"phonics_tsalagi_"..key.."_active.png"}, light_source = 20, is_ground_content = true, groups = {cracky=3, choppy=3, not_in_creative_inventory=1}, sounds = default.node_sound_stone_defaults(), }) if phonics_tsalagi[key].is_letter ==1 then minetest.register_node("phonics_tsalagi:0"..key, { description = "Silent "..key, tiles = {"phonics_tsalagi_0"..key..".png"}, is_ground_content = true, groups = {cracky=3, choppy=3}, sounds = default.node_sound_stone_defaults(), }) end end minetest.register_node("phonics_tsalagi:question_mark", { description = "Question Mark", tiles = { "question_mark.png",}, is_ground_content = true, paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), -- on_punch = function(pos, node, puncher) -- end }) minetest.register_node("phonics_tsalagi:exclamation_point", { description = "Exclamation Point", tiles = { "exclamation_point.png",}, is_ground_content = true, paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), -- on_punch = function(pos, node, puncher) -- end }) minetest.register_node("phonics_tsalagi:period", { description = "Period", tiles = { "period.png",}, is_ground_content = true, paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), -- on_punch = function(pos, node, puncher) -- end }) minetest.register_node("phonics_tsalagi:SayWord", { description = "say word", tiles = { "white.jpg", "white.jpg", "SpeakingMouth64.png", "SpeakingMouth64.png", "SpeakingMouth64.png", "SpeakingMouth64.png",}, is_ground_content = true, paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), on_punch = function(pos, node, puncher) sound_out_word(pos, "x", 1) sound_out_word(pos, "x", -1) sound_out_word(pos, "z", 1) sound_out_word(pos, "z", -1) end }) minetest.register_node("phonics_tsalagi:PaperStart", { description = "Paper Start", tiles = { "white.jpg", "white.jpg", "nicubunu_Scroll.png", "nicubunu_Scroll.png", "nicubunu_Scroll.png", "nicubunu_Scroll.png",}, is_ground_content = true, paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), after_place_node = function(pos) get_page_start_loc(pos) end, on_punch = function(pos, node, puncher) clear_page(pos) end--[[, on_dig = function(pos_dig,node) replace_page(pos_dig, "x", 1, "air") replace_page(pos_dig, "x", -1, "air") replace_page(pos_dig, "z", 1, "air") replace_page(pos_dig, "z", -1, "air") replace_column(pos_dig, "air") end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local player = digger:get_player_name() local itemstack = ItemStack("phonics_tsalagi:PaperStart") local inv = minetest.get_inventory({type = "player", name = player}) if inv and inv:room_for_item("main", itemstack) then inv:add_item("main", itemstack) else -- If the player's inventory is full, spawn the item on the ground minetest.add_item(pos, itemstack) end end]] }) function clear_page(pos) local clear_pos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference clear_pos.x = pos.x clear_pos.y = pos.y clear_pos.z = pos.z replace_page(clear_pos, "x", 1, "phonics_tsalagi:BlankPaper") replace_page(clear_pos, "x", -1, "phonics_tsalagi:BlankPaper") replace_page(clear_pos, "z", 1, "phonics_tsalagi:BlankPaper") replace_page(clear_pos, "z", -1, "phonics_tsalagi:BlankPaper") replace_column(clear_pos, "phonics_tsalagi:BlankPaper") page_start = pos page_end = pos end minetest.register_node("phonics_tsalagi:PaperFinish", { description = "Paper Finish", tiles = { "white.jpg", "white.jpg", "finish_line_flag_pin_th.png", "finish_line_flag_pin_th.png", "finish_line_flag_pin_th.png", "finish_line_flag_pin_th.png",}, is_ground_content = true, paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), after_place_node = function(pos) blank_page(pos) end }) minetest.register_node("phonics_tsalagi:BlankPaper", { description = "Blank Paper", tiles = { "white.jpg", "white.jpg", "white.jpg", "white.jpg", "white.jpg", "white.jpg",}, is_ground_content = true, paramtype = "light", paramtype2 = "facedir", groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), }) function split(str, pat) local t = {} -- NOTE: use {n = 0} in Lua-5.0 local fpat = "(.-)" .. pat local last_end = 1 local s, e, cap = str:find(fpat, 1) while s do if s ~= 1 or cap ~= "" then table.insert(t,cap) end last_end = e+1 s, e, cap = str:find(fpat, last_end) end if last_end <= #str then cap = str:sub(last_end) table.insert(t, cap) end return t end local play_sound = function(list, soundname) local gain = 1.0 local handler = minetest.sound_play("phonics_tsalagi_"..soundname, {gain=gain}) end function revertnode(parms) local pos3 = parms[1] local node3= parms[2] minetest.env:remove_node(pos3,{name="phonics_tsalagi:"..node3.."_active"}) minetest.env:place_node(pos3,{name="phonics_tsalagi:"..node3}) end function activate_node(anparms) local pos2 = anparms[1] local nodename = anparms[2] local duration = anparms[3] minetest.env:remove_node(pos2,{name="phonics_tsalagi:"..nodename}) minetest.env:place_node(pos2,{name="phonics_tsalagi:"..nodename.."_active"}) play_sound(phonics_tsalagi, nodename) local np = {} --needed this because the node being passed to revertnode was incremented (must have been by reference np.x = pos2.x np.y = pos2.y np.z = pos2.z minetest.after(duration, revertnode, {np, nodename}) end function sound_out_word(pos1, axis, direction) local cumulative_delay = 0 local mpos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference mpos.x = pos1.x mpos.y = pos1.y mpos.z = pos1.z --see if there are any sounds next to mouth on this axis. (or if there is a BlankPage before it.) If not, do nothing. local test_pos = {} test_pos.x = pos1.x test_pos.y = pos1.y test_pos.z = pos1.z if axis == "x" then test_pos.x=test_pos.x+direction end if axis == "z" then test_pos.z=test_pos.z+direction end local test_nodename = minetest.env:get_node(test_pos).name local test_nodenamearray = split(test_nodename, ":") local test_nodename_prefix = test_nodenamearray[1] local test_nodename_suffix = test_nodenamearray[2] --see if blank page before it if axis == "x" then test_pos.x=test_pos.x-(direction*2) end if axis == "z" then test_pos.z=test_pos.z-(direction*2) end local b4_nodename = minetest.env:get_node(test_pos).name if b4_nodename ~="phonics_tsalagi:BlankPaper" then if test_nodename_prefix ~="phonics_tsalagi" or test_nodename_suffix == "BlankPaper" or test_nodename_suffix =="PaperStart" then return end end local row_count = 1 repeat --go to next row 1 time repeat --continue sounding on this row until you reach blank paper or a non phonics_tsalagi node if axis == "x" then mpos.x=mpos.x+direction end if axis == "z" then mpos.z=mpos.z+direction end local nodename = minetest.env:get_node(mpos).name local nodenamearray = split(nodename, ":") local nodename_prefix = nodenamearray[1] local nodename_suffix = nodenamearray[2] local delay = phonics_tsalagi[nodename_suffix] if delay ~=nil and nodename_prefix =="phonics_tsalagi" then local lpos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference lpos.x = mpos.x lpos.y = mpos.y lpos.z = mpos.z minetest.after(cumulative_delay, activate_node, {lpos, nodename_suffix, phonics_tsalagi[nodename_suffix].length}) cumulative_delay = cumulative_delay + phonics_tsalagi[nodename_suffix].length end until nodename_prefix ~="phonics_tsalagi" or nodename_suffix == "BlankPaper" --if I will find a BlankPaper in this row, then dont look in next row local find_blank_pos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference find_blank_pos.x = mpos.x find_blank_pos.y = mpos.y find_blank_pos.z = mpos.z repeat --is this node BlankPaper? local find_blank_nodename = minetest.env:get_node(find_blank_pos).name local find_blank_nodenamearray = split(find_blank_nodename, ":") local find_blank_nodename_prefix = find_blank_nodenamearray[1] local find_blank_nodename_suffix = find_blank_nodenamearray[2] if find_blank_nodename_suffix == "BlankPaper" then return end --if not, increment pointer and repeat search if axis == "x" then find_blank_pos.x=find_blank_pos.x+direction end if axis == "z" then find_blank_pos.z=find_blank_pos.z+direction end until find_blank_nodename_prefix ~="phonics_tsalagi"--prefix not phonics_tsalagi --we're not done, so search next row for more phonics_tsalagi to sound out local new_row_pos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference new_row_pos.x = mpos.x new_row_pos.y = mpos.y new_row_pos.z = mpos.z new_row_pos.y=new_row_pos.y-1 if nodename_suffix == "BlankPaper" then return end repeat --go to the beginning of the new row if axis == "x" then new_row_pos.x=new_row_pos.x-direction end if axis == "z" then new_row_pos.z=new_row_pos.z-direction end local new_row_nodename = minetest.env:get_node(new_row_pos).name local new_row_nodenamearray = split(new_row_nodename, ":") local new_row_nodename_prefix = new_row_nodenamearray[1] local new_row_nodename_suffix = new_row_nodenamearray[2] mpos.x = new_row_pos.x mpos.y = new_row_pos.y mpos.z = new_row_pos.z until new_row_nodename_prefix ~="phonics_tsalagi" row_count= row_count +1 until row_count >2 or nodename_suffix == "BlankPaper" end function write_message_to_page(message) local start_page_pos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference start_page_pos.x = page_start.x start_page_pos.y = page_start.y start_page_pos.z = page_start.z local start_message_pos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference start_message_pos.x = page_start.x start_message_pos.y = page_start.y start_message_pos.z = page_start.z write_message_to_page_on_axis(start_message_pos, "x", 1, message) write_message_to_page_on_axis(start_message_pos, "x", -1, message) write_message_to_page_on_axis(start_message_pos, "z", 1, message) write_message_to_page_on_axis(start_message_pos, "z", -1, message) end function write_message_to_page_on_axis(pos, axis, direction,message) local page_position = {} --needed this because the node being passed to revertnode was incremented (must have been by reference page_position.x = pos.x page_position.y = pos.y page_position.z = pos.z message_index = 1 --if the first node after the PageStart node is not a phonic, skip everything. local first_position = {} first_position.x = pos.x first_position.y = pos.y first_position.z = pos.z if axis=="x" then first_position.x = first_position.x +direction end if axis=="z" then first_position.z = first_position.z +direction end local first_nodename = minetest.env:get_node(first_position).name local firstnamearray = split(first_nodename, ":") local firstname_prefix = firstnamearray[1] if firstname_prefix == "phonics_tsalagi" then --we have phonics_tsalagi on this axis repeat local current_nodename = minetest.env:get_node(page_position).name local nodenamearray = split(current_nodename, ":") local nodename_prefix = nodenamearray[1] local nodename_suffix = nodenamearray[2] write_page_row(page_position, axis, direction,message) page_position.y = page_position.y-1 until nodename_prefix ~="phonics_tsalagi" or message_index > string.len(message) end end function write_page_row(pos, axis, direction, message) local replace_pointer = {} --needed this because the node being passed to revertnode was incremented (must have been by reference replace_pointer.x = pos.x replace_pointer.y = pos.y replace_pointer.z = pos.z local nodename = minetest.env:get_node(replace_pointer).name if nodename=="phonics_tsalagi:PaperStart" then if axis == "x" then replace_pointer.x=replace_pointer.x+direction new_nodename ="phonics_tsalagi:SayWord" minetest.env:add_node(replace_pointer, {name=new_nodename}) replace_pointer.x=replace_pointer.x+direction end if axis == "z" then replace_pointer.z=replace_pointer.z+direction new_nodename ="phonics_tsalagi:SayWord" minetest.env:add_node(replace_pointer, {name=new_nodename}) replace_pointer.z=replace_pointer.z+direction end end --1get me node at current location --2if node prefix is phonics_tsalagi then replace node with next phonic in the message --3(and have some code behind the scenes automatically bump the message_index) --4increment the replace pointer --5repeat 1-4 until node prefix at current location is not phonics_tsalagi repeat local nodename = minetest.env:get_node(replace_pointer).name local nodenamearray = split(nodename, ":") local nodename_prefix = nodenamearray[1] local nodename_suffix = nodenamearray[2] if nodename_prefix =="phonics_tsalagi" then if new_nodename =="phonics_tsalagi:BlankPaper" then --if we had a space between words then inject sayword block into stream new_nodename ="phonics_tsalagi:SayWord" minetest.env:add_node(replace_pointer, {name=new_nodename}) else new_nodename = get_next_phonic_in_message(message) if minetest.registered_nodes[new_nodename] then minetest.env:add_node(replace_pointer, {name=new_nodename}) --******************************************* end end if minetest.registered_nodes[new_nodename] then if axis == "x" then replace_pointer.x=replace_pointer.x+direction end if axis == "z" then replace_pointer.z=replace_pointer.z+direction end end end until nodename_prefix ~="phonics_tsalagi" or message_index > string.len(message) end function get_next_phonic_in_message(message) --and have some code behind the scenes automatically bump the message_index string.len(message) if message_index <= string.len(message) then local current_char_in_message = string.sub(message,message_index,message_index) phonics_tsalagi = current_char_in_message --if currentchar=" " then just set cpim to blankPaper and skip all the char business" if current_char_in_message==" " then current_phonic_in_message = "phonics_tsalagi:BlankPaper" elseif current_char_in_message=="." then current_phonic_in_message = "phonics_tsalagi:period" elseif current_char_in_message=="?" then current_phonic_in_message = "phonics_tsalagi:question_mark" elseif current_char_in_message=="!" then current_phonic_in_message = "phonics_tsalagi:exclamation_point" else if current_char_in_message == "0" or current_char_in_message == "_" then message_index = message_index +1 current_char_in_message = string.sub(message,message_index,message_index) phonics_tsalagi = phonics_tsalagi..current_char_in_message end char_after_current_char = string.sub(message,message_index+1,message_index+1) third_char = string.sub(message,message_index+2,message_index+2) two_chars = current_char_in_message..char_after_current_char three_chars = two_chars..third_char --minetest.log("x", "phonics_tsalagi: "..phonics_tsalagi) --minetest.log("x", "phonics_tsalagi 1st char: "..string.sub(phonics_tsalagi,1,1)) --minetest.log("x", "two_chars: "..two_chars) --check to see if this is a 2 character phonic. But only if it doesn't begin with an "_" or if it is _oo. --this is because the only two character phonic that can use the "_" prefix is the "_oo" phonic. if (two_char_phonics_tsalagi[two_chars] ~= nil and string.sub(phonics_tsalagi,1,1) ~= "_" and string.sub(phonics_tsalagi,1,1) ~= "0") or (two_chars == "oo" and string.sub(phonics_tsalagi,1,1) ~= "0") then phonics_tsalagi = phonics_tsalagi..char_after_current_char message_index = message_index +1 end if (three_char_phonics_tsalagi[three_chars] ~= nil and string.sub(phonics_tsalagi,1,1) ~= "_" and string.sub(phonics_tsalagi,1,1) ~= "0")then phonics_tsalagi = phonics_tsalagi..string.sub(message,message_index+1,message_index+2) message_index = message_index +2 end current_phonic_in_message = "phonics_tsalagi:"..phonics_tsalagi end message_index = message_index +1 else current_phonic_in_message = "phonics_tsalagi:BlankPaper" end return current_phonic_in_message end function replace_page(pos, axis, direction,new_nodename) local replace_row_pos = {} --needed this because the node being passed to revertnode was incremented (must have been by reference replace_row_pos.x = pos.x replace_row_pos.y = pos.y replace_row_pos.z = pos.z repeat local current_nodename = minetest.env:get_node(replace_row_pos).name local nodenamearray = split(current_nodename, ":") local nodename_prefix = nodenamearray[1] local nodename_suffix = nodenamearray[2] replace_page_row(replace_row_pos, axis, direction,new_nodename) replace_row_pos.y = replace_row_pos.y-1 until nodename_prefix ~="phonics_tsalagi" end function replace_column(pos, new_nodename) replace_column_pos= pos repeat local current_nodename = minetest.env:get_node(replace_column_pos).name local nodenamearray = split(current_nodename, ":") local nodename_prefix = nodenamearray[1] local nodename_suffix = nodenamearray[2] if nodename_prefix =="phonics_tsalagi" then if new_nodename =="air" then minetest.env:add_node(replace_column_pos, {name=new_nodename}) end if new_nodename =="phonics_tsalagi:BlankPaper" and current_nodename ~="phonics_tsalagi:PaperStart" then minetest.env:add_node(replace_column_pos, {name=new_nodename}) end end replace_column_pos.y = replace_column_pos.y-1 until nodename_prefix ~="phonics_tsalagi" end function replace_page_row(pos, axis, direction, new_nodename) local replace_pointer = {} --needed this because the node being passed to revertnode was incremented (must have been by reference replace_pointer.x = pos.x replace_pointer.y = pos.y replace_pointer.z = pos.z repeat if axis == "x" then replace_pointer.x=replace_pointer.x+direction end if axis == "z" then replace_pointer.z=replace_pointer.z+direction end local nodename = minetest.env:get_node(replace_pointer).name local nodenamearray = split(nodename, ":") local nodename_prefix = nodenamearray[1] local nodename_suffix = nodenamearray[2] if nodename_prefix =="phonics_tsalagi" then minetest.env:add_node(replace_pointer, {name=new_nodename}) end until nodename_prefix ~="phonics_tsalagi" end function get_page_start_loc(pos) page_start = pos end function blank_page(pos) page_end = pos if page_start ~= nil and math.abs(page_start.x-page_end.x) <20 and math.abs(page_start.y-page_end.y) <20 and math.abs(page_start.z-page_end.z) <20 then if page_end.y <= page_start.y then --if the page end block was placed at or below page start block if page_end.x == page_start.x then buildwall(page_start.z, pos.z, page_start.y, pos.y, "x", pos.x, "phonics_tsalagi:BlankPaper") end if page_end.z == page_start.z then buildwall(page_start.x, pos.x, page_start.y, pos.y, "z", pos.z, "phonics_tsalagi:BlankPaper") end end end end function buildwall(hstart, hend, ystart, yend, haxis, haxis_fixed, nodename) repeat buildrow(hstart, hend, ystart, haxis, haxis_fixed, nodename) ystart = ystart -1 until ystart < yend end function buildrow(hstart, hend, y, haxis, haxis_fixed, nodename) local hpos = math.min(hstart, hend) local hmax = math.max(hstart, hend) local current_pos={} current_pos.y = y repeat if haxis =="x" then current_pos.z = hpos current_pos.x = haxis_fixed end if haxis =="z" then current_pos.x = hpos current_pos.z = haxis_fixed end if minetest.env:get_node(current_pos).name ~= "phonics_tsalagi:PaperStart" then --leave paperstart node there. minetest.env:add_node(current_pos, {name=nodename}) end hpos = hpos +1 until hpos> hmax end minetest.register_chatcommand("w", { params = "", description = "Write phonics_tsalagi message on a page", privs = {shout=true}, func = function(name, param) if page_start == nil or page_end == nil then minetest.chat_send_player(name, "You need to create a page first") return end write_message(string.lower(param)) end, }) function write_message(param) write_message_to_page(param) end --turn the phonics_tsalagi nodes into ores: -- Function to generate the phonics_tsalagi nodes underground phonics_tsalagi_scarcity = tonumber(minetest.settings:get("phonics_tsalagi_scarcity")) or 350 if phonics_tsalagi_scarcity >0 then -- Register nodes based on the phonics_tsalagi data for key, value in pairs(phonics_tsalagi) do -- Generate the nodes underground using the register_ore function minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:" .. key, wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) if phonics_tsalagi[key].is_letter ==1 then minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:0" .. key, wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) end end minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:SayWord", wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:PaperStart", wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:PaperFinish", wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:period", wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:exclamation_point", wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) minetest.register_ore({ ore_type = "scatter", ore = "phonics_tsalagi:question_mark", wherein = "default:stone", clust_scarcity = phonics_tsalagi_scarcity, clust_num_ores = 1, clust_size = 1, y_min = -31000, -- Adjust these values for your desired depth range y_max = 100, }) end local dpath = minetest.get_modpath("phonics_tsalagi") .. "/" dofile(dpath .. "crafting.lua") print("phonics_tsalagi Mod Loaded!") --minetest.env:punch_node(pos) --minetest.env:dig_node(pos) --http://minetest.net/forum/viewtopic.php?id=2602 --https://c9.io/lkjoel/minetest-modder/workspace/parseme.txt