DeepBlueFrog Posted July 6, 2014 Posted July 6, 2014 just a heads up, I' ve just started with the latest version (0.9) and now you can use the "mph" dialogue without being gagged Same here. After upgrading to 0.9, every NPC has a 'mpfff' dialogue without my character being gagged. However, once the action of the dialogue is done ( ' this is my lucky day' ), the 'mpffff' option is gone for these NPCs. I haven't tested with a gag yet, but it looks like an initialization issue for the new dialogue refactoring.
irquih Posted July 6, 2014 Author Posted July 6, 2014 just a heads up, I' ve just started with the latest version (0.9) and now you can use the "mph" dialogue without being gagged Same here but it only seems to appear the once on install. After you "mphh" at someone it seems to disappear after that so no big deal I noticed the same, including it only being once. Yay, a bug! (Well, yay, since I'm going to squash it!) just a heads up, I' ve just started with the latest version (0.9) and now you can use the "mph" dialogue without being gagged Same here. After upgrading to 0.9, every NPC has a 'mpfff' dialogue without my character being gagged. However, once the action of the dialogue is done ( ' this is my lucky day' ), the 'mpffff' option is gone for these NPCs. I haven't tested with a gag yet, but it looks like an initialization issue for the new dialogue refactoring. The bug is quite tricky, took me a while to figure out what's going on (especially since I was trying to reproduce it after it had gone away and it didn't re-appear). It is quite harmless. Well, apart from the rape. The very first 'Mmph' is a top-level dialog, hence it may show up next to all normal dialog. And the state machine is initialized to 0 when installing on a new game. The former makes the Mmph show up, while the latter makes it proceed into the 'It's my lucky day' dialog followed by rape. After that dialog fires, the state machine is set to -1 (to prevent any further dialog from triggering. Since the main entry point (which only fires if you're gagged) doesn't trigger, it isn't reset to 0, hence it only appearing once. Anyway, working on a fix now. I'll remove it's top-level dialog property (it's not needed anyway) and that should fix it. Once I implement non-gagged dialog, I may revisit that, depending on how I initialize that. [edit] fix is up, version 0.9.1
irquih Posted July 6, 2014 Author Posted July 6, 2014 that was fast Meh, four hours. I've done better. Thanks for the compliment. It's all in the planning: when I do a release, I make sure to check back in a few hours to see if there is a bug and have enough time to at least asses the bug. The least I can do is put up a recommendation (what I did for 0.7, since that was nasty). Once the recommendation is out I work on fixing it. I actually have a development environment that helps me out a lot. I use git to manage the repository (so that if I want to make a fix to a release, I can switch to that branch). I have scripts that do cleaning, the mass compile (of all scripts), packaging etc. The only manual parts (apart from the coding) are testing and putting the thing online. But once I decide that the code should be released, it takes me 30 seconds to build the package, for instance. I'm proud of that.
jonjonzz Posted July 6, 2014 Posted July 6, 2014 Let me quote the public api: OnPlayerBowShot(Weapon akWeapon, Ammo akAmmo, Float afPower, Bool abSunGazing) To me, this design sounds more like "aawww, fuck it. just add the parameter and be done with it." ... Not the kind of designers you want working on your modding framework. Isn't that actually used for Auriel's bow? And let's not forget the fact that we are working with a compiled language here guys, if designing languages is easy then by all means make your own compiler to implement those keywords you are missing. A For loop, for instance, looks very much like a while loop in terms of the assembly or the bytecode in the compiled product. EDIT: http://www.uesp.net/wiki/Tes5Mod:Compiled_Script_File_Format
Kimy Posted July 6, 2014 Posted July 6, 2014 And let's not forget the fact that we are working with a compiled language here guys, if designing languages is easy then by all means make your own compiler to implement those keywords you are missing. A For loop, for instance, looks very much like a while loop in terms of the assembly or the bytecode in the compiled product. I have never been a fan of the "You can't criticize anything unless you make something better" type of argument, to be honest. Being easy and being time-consuming doesn't rule each other out, and I am pretty sure nobody of us wants to rewrite the Papyrus compiler from scratch just to prove that we could implement a "for" keyword. I think anyone who ever wrote a line of code knows that "for" and "while" are similar concepts. That doesn't mean that having it (and some other staples of modern languages that Papyrus is sorely missing) wouldn't be convenient.
jonjonzz Posted July 6, 2014 Posted July 6, 2014 And let's not forget the fact that we are working with a compiled language here guys, if designing languages is easy then by all means make your own compiler to implement those keywords you are missing. A For loop, for instance, looks very much like a while loop in terms of the assembly or the bytecode in the compiled product. I have never been a fan of the "You can't criticize anything unless you make something better" type of argument, to be honest. Being easy and being time-consuming doesn't rule each other out, and I am pretty sure nobody of us wants to rewrite the Papyrus compiler from scratch just to prove that we could implement a "for" keyword. I think anyone who ever wrote a line of code knows that "for" and "while" are similar concepts. That doesn't mean that having it (and some other staples of modern languages that Papyrus is sorely missing) wouldn't be convenient. That isn't the point. The above posts are outright insulting to the game developers and while this community may be alright with mod developers alienating us from others I think it is a bad idea. Structs are not staples of modern languages (Java doesn't have structs and Java is used on almost as many devices as there are people in this world). For loops are not necessary and while I'm sure the compiler could have contained the necessary code to allow for loops let's not forget that this language is a language for a GAME not for mass production and each minute spent on the development of the compiler/language costs Bethesda a significant amount of money. You guys are acting like Papyrus should have all of the comforts of C, JAVA, or Python but realize those are GIGANTIC projects with entire corporations or open source communities helping with development. What I am saying to you is you are acting spoiled/entitled in every post. Get over it, be happy with what you are given and work with it. EDIT: BTW, to everyone complaining about the lack of structs. YOU HAVE THEM. Papyrus has no access restrictions so creating a new object with the necessary members is equivalent to creating a struct.
irquih Posted July 7, 2014 Author Posted July 7, 2014 (edited) I have never been a fan of the "You can't criticize anything unless you make something better" type of argument, to be honest. Being easy and being time-consuming doesn't rule each other out, and I am pretty sure nobody of us wants to rewrite the Papyrus compiler from scratch just to prove that we could implement a "for" keyword. I think anyone who ever wrote a line of code knows that "for" and "while" are similar concepts. That doesn't mean that having it (and some other staples of modern languages that Papyrus is sorely missing) wouldn't be convenient. Exactly. There are certain constructs that any language nowadays should have. Papyrus doesn't have them. Edited July 11, 2014 by irquih
xboronx Posted July 7, 2014 Posted July 7, 2014 .... Thirdly, if you want to know how ridiculously basic the Papyrus language is, consider a function: int[] Function newArray(int sz) return new int[sz] EndFunction Looks trivial, right? Except it doesn't work, because the compiler cannot handle dynamic arrays. So instead, we have this: ; Grmbl grmbl, stupid compiler. ; To anyone who thinks they want this function, go ahead and copy-paste it. ; No need to attribute, it's kinda straightforward and obvious after all. int[] Function NewArray(int sz) global if sz < 64 ; 0 <= sz < 64 if sz < 32 ; 0 <= sz < 32 if sz < 16 ; 0 <= sz < 16 if sz < 8 ; 0 <= sz < 8 if sz < 4 ; 0 <= sz < 4 if sz < 2 ; 0 <= sz < 2 if sz < 1 ; 0 <= sz < 1 int[] empty return empty ; new int[0] will trigger a compiler error, none will trigger papyrus error; this language is so screwed up... else ; 1 <= sz < 2 return new int[1] endif else ; 2 <= sz < 4 if sz < 3 ; 2 <= sz < 3 return new int[2] else ; 3 <= sz < 4 return new int[3] endif endif else ; 4 <= sz < 8 if sz < 6 ; 4 <= sz < 6 if sz < 5 ; 4 <= sz < 5 return new int[4] else ; 5 <= sz < 6 return new int[5] endif else ; 6 <= sz < 8 if sz < 7 ; 6 <= sz < 7 return new int[6] else ; 7 <= sz < 8 return new int[7] endif endif endif else ; 8 <= sz < 16 if sz < 12 ; 8 <= sz < 12 if sz < 10 ; 8 <= sz < 10 if sz < 9 ; 8 <= sz < 9 return new int[8] else ; 9 <= sz < 10 return new int[9] endif else ; 10 <= sz < 12 if sz < 11 ; 10 <= sz < 11 return new int[10] else ; 11 <= sz < 12 return new int[11] endif endif else ; 12 <= sz < 16 if sz < 14 ; 12 <= sz < 14 if sz < 13 ; 12 <= sz < 13 return new int[12] else ; 13 <= sz < 14 return new int[13] endif else ; 14 <= sz < 16 if sz < 15 ; 14 <= sz < 15 return new int[14] else ; 15 <= sz < 16 return new int[15] endif endif endif endif else ; 16 <= sz < 32 if sz < 24 ; 16 <= sz < 24 if sz < 20 ; 16 <= sz < 20 if sz < 18 ; 16 <= sz < 18 if sz < 17 ; 16 <= sz < 17 return new int[16] else ; 17 <= sz < 18 return new int[17] endif else ; 18 <= sz < 20 if sz < 19 ; 18 <= sz < 19 return new int[18] else ; 19 <= sz < 20 return new int[19] endif endif else ; 20 <= sz < 24 if sz < 22 ; 20 <= sz < 22 if sz < 21 ; 20 <= sz < 21 return new int[20] else ; 21 <= sz < 22 return new int[21] endif else ; 22 <= sz < 24 if sz < 23 ; 22 <= sz < 23 return new int[22] else ; 23 <= sz < 24 return new int[23] endif endif endif else ; 24 <= sz < 32 if sz < 28 ; 24 <= sz < 28 if sz < 26 ; 24 <= sz < 26 if sz < 25 ; 24 <= sz < 25 return new int[24] else ; 25 <= sz < 26 return new int[25] endif else ; 26 <= sz < 28 if sz < 27 ; 26 <= sz < 27 return new int[26] else ; 27 <= sz < 28 return new int[27] endif endif else ; 28 <= sz < 32 if sz < 30 ; 28 <= sz < 30 if sz < 29 ; 28 <= sz < 29 return new int[28] else ; 29 <= sz < 30 return new int[29] endif else ; 30 <= sz < 32 if sz < 31 ; 30 <= sz < 31 return new int[30] else ; 31 <= sz < 32 return new int[31] endif endif endif endif endif else ; 32 <= sz < 64 if sz < 48 ; 32 <= sz < 48 if sz < 40 ; 32 <= sz < 40 if sz < 36 ; 32 <= sz < 36 if sz < 34 ; 32 <= sz < 34 if sz < 33 ; 32 <= sz < 33 return new int[32] else ; 33 <= sz < 34 return new int[33] endif else ; 34 <= sz < 36 if sz < 35 ; 34 <= sz < 35 return new int[34] else ; 35 <= sz < 36 return new int[35] endif endif else ; 36 <= sz < 40 if sz < 38 ; 36 <= sz < 38 if sz < 37 ; 36 <= sz < 37 return new int[36] else return new int[37] endif else ; 38 <= sz < 40 if sz < 39 ; 38 <= sz < 39 return new int[38] else ; 39 <= sz < 40 return new int[39] endif endif endif else ; 40 <= sz < 48 if sz < 44 ; 40 <= sz < 44 if sz < 42 ; 40 <= sz < 42 if sz < 41 ; 40 <= sz < 41 return new int[40] else ; 41 <= sz < 42 return new int[41] endif else ; 42 <= sz < 44 if sz < 43 ; 42 <= sz < 43 return new int[42] else ; 43 <= sz < 44 return new int[43] endif endif else ; 44 <= sz < 48 if sz < 46 ; 44 <= sz < 46 if sz < 45 ; 44 <= sz < 45 return new int[44] else ; 45 <= sz < 46 return new int[45] endif else ; 46 <= sz < 48 if sz < 47 ; 46 <= sz < 47 return new int[46] else ; 47 <= sz < 48 return new int[47] endif endif endif endif else ; 48 <= sz < 64 if sz < 56 ; 48 <= sz < 56 if sz < 52 ; 48 <= sz < 52 if sz < 50 ; 48 <= sz < 50 if sz < 49 ; 48 <= sz < 49 return new int[48] else ; 49 <= sz < 50 return new int[49] endif else ; 50 <= sz < 52 if sz < 51 ; 50 <= sz < 51 return new int[50] else ; 51 <= sz < 52 return new int[51] endif endif else ; 52 <= sz < 56 if sz < 54 ; 52 <= sz < 54 if sz < 53 ; 52 <= sz < 53 return new int[52] else ; 53 <= sz < 54 return new int[53] endif else ; 54 <= sz < 56 if sz < 55 ; 54 <= sz < 55 return new int[54] else ; 55 <= sz < 56 return new int[55] endif endif endif else ; 56 <= sz < 64 if sz < 60 ; 56 <= sz < 60 if sz < 58 ; 56 <= sz < 58 if sz < 57 ; 56 <= sz < 57 return new int[56] else ; 57 <= sz < 58 return new int[57] endif else ; 58 <= sz < 60 if sz < 59 ; 58 <= sz < 59 return new int[58] else ; 59 <= sz < 60 return new int[59] endif endif else ; 60 <= sz < 64 if sz < 62 ; 60 <= sz < 62 if sz < 61 ; 60 <= sz < 61 return new int[60] else ; 61 <= sz < 62 return new int[61] endif else ; 62 <= sz < 64 if sz < 63 ; 62 <= sz < 63 return new int[62] else ; 63 <= sz < 64 return new int[63] endif endif endif endif endif endif elseif sz < 128 ; 64 <= sz < 128 if sz < 96 ; 64 <= sz < 96 if sz < 80 ; 64 <= sz < 80 if sz < 72 ; 64 <= sz < 72 if sz < 68 ; 64 <= sz < 68 if sz < 66 ; 64 <= sz < 66 if sz < 65 ; 64 <= sz < 65 return new int[64] else ; 65 <= sz < 66 return new int[65] endif else ; 66 <= sz < 68 if sz < 67 ; 66 <= sz < 67 return new int[66] else ; 67 <= sz < 68 return new int[67] endif endif else ; 68 <= sz < 72 if sz < 70 ; 68 <= sz < 70 if sz < 69 ; 68 <= sz < 69 return new int[68] else ; 69 <= sz < 70 return new int[69] endif else ; 70 <= sz < 72 if sz < 71 ; 70 <= sz < 71 return new int[70] else ; 71 <= sz < 72 return new int[71] endif endif endif else ; 72 <= sz < 80 if sz < 76 ; 72 <= sz < 76 if sz < 74 ; 72 <= sz < 74 if sz < 73 ; 72 <= sz < 73 return new int[72] else ; 73 <= sz < 74 return new int[73] endif else ; 74 <= sz < 76 if sz < 75 ; 74 <= sz < 75 return new int[74] else ; 75 <= sz < 76 return new int[75] endif endif else ; 76 <= sz < 80 if sz < 78 ; 76 <= sz < 78 if sz < 77 ; 76 <= sz < 77 return new int[76] else ; 77 <= sz < 78 return new int[77] endif else ; 78 <= sz < 80 if sz < 79 ; 78 <= sz < 79 return new int[78] else ; 79 <= sz < 80 return new int[79] endif endif endif endif else ; 80 <= sz < 96 if sz < 88 ; 80 <= sz < 88 if sz < 84 ; 80 <= sz < 84 if sz < 82 ; 80 <= sz < 82 if sz < 81 ; 80 <= sz < 81 return new int[80] else ; 81 <= sz < 82 return new int[81] endif else ; 82 <= sz < 84 if sz < 83 ; 82 <= sz < 83 return new int[82] else ; 83 <= sz < 84 return new int[83] endif endif else ; 84 <= sz < 88 if sz < 86 ; 84 <= sz < 86 if sz < 85 ; 84 <= sz < 85 return new int[84] else ; 85 <= sz < 86 return new int[85] endif else ; 86 <= sz < 88 if sz < 87 ; 86 <= sz < 87 return new int[86] else ; 87 <= sz < 88 return new int[87] endif endif endif else ; 88 <= sz < 96 if sz < 92 ; 88 <= sz < 92 if sz < 90 ; 88 <= sz < 90 if sz < 89 ; 88 <= sz < 89 return new int[88] else ; 89 <= sz < 90 return new int[89] endif else ; 90 <= sz < 92 if sz < 91 ; 90 <= sz < 91 return new int[90] else ; 91 <= sz < 92 return new int[91] endif endif else ; 92 <= sz < 96 if sz < 94 ; 92 <= sz < 94 if sz < 93 ; 92 <= sz < 93 return new int[92] else ; 93 <= sz < 94 return new int[93] endif else ; 94 <= sz < 96 if sz < 95 ; 94 <= sz < 95 return new int[94] else ; 95 <= sz < 96 return new int[95] endif endif endif endif endif else ; 96 <= sz < 128 if sz < 112 ; 96 <= sz < 112 if sz < 104 ; 96 <= sz < 104 if sz < 100 ; 96 <= sz < 100 if sz < 98 ; 96 <= sz < 98 if sz < 97 ; 96 <= sz < 97 return new int[96] else ; 97 <= sz < 98 return new int[97] endif else ; 98 <= sz < 100 if sz < 99 ; 98 <= sz < 99 return new int[98] else ; 99 <= sz < 100 return new int[99] endif endif else ; 100 <= sz < 104 if sz < 102 ; 100 <= sz < 102 if sz < 101 ; 100 <= sz < 101 return new int[100] else ; 101 <= sz < 102 return new int[101] endif else ; 102 <= sz < 104 if sz < 103 ; 102 <= sz < 103 return new int[102] else ; 103 <= sz < 104 return new int[103] endif endif endif else ; 104 <= sz < 112 if sz < 108 ; 104 <= sz < 108 if sz < 106 ; 104 <= sz < 106 if sz < 105 ; 104 <= sz < 105 return new int[104] else ; 105 <= sz < 106 return new int[105] endif else ; 106 <= sz < 108 if sz < 107 ; 106 <= sz < 107 return new int[106] else ; 107 <= sz < 108 return new int[107] endif endif else ; 108 <= sz < 112 if sz < 110 ; 108 <= sz < 110 if sz < 109 ; 108 <= sz < 109 return new int[108] else ; 109 <= sz < 110 return new int[109] endif else ; 110 <= sz < 112 if sz < 111 ; 110 <= sz < 111 return new int[110] else ; 111 <= sz < 112 return new int[111] endif endif endif endif else ; 112 <= sz < 128 if sz < 120 ; 112 <= sz < 120 if sz < 116 ; 112 <= sz < 116 if sz < 114 ; 112 <= sz < 114 if sz < 113 ; 112 <= sz < 113 return new int[112] else ; 113 <= sz < 114 return new int[113] endif else ; 114 <= sz < 116 if sz < 115 ; 114 <= sz < 115 return new int[114] else ; 115 <= sz < 116 return new int[115] endif endif else ; 116 <= sz < 120 if sz < 118 ; 116 <= sz < 118 if sz < 117 ; 116 <= sz < 117 return new int[116] else ; 117 <= sz < 118 return new int[117] endif else ; 118 <= sz < 120 if sz < 119 ; 118 <= sz < 119 return new int[118] else ; 119 <= sz < 120 return new int[119] endif endif endif else ; 120 <= sz < 128 if sz < 124 ; 120 <= sz < 124 if sz < 122 ; 120 <= sz < 122 if sz < 121 ; 120 <= sz < 121 return new int[120] else ; 121 <= sz < 122 return new int[121] endif else ; 122 <= sz < 124 if sz < 123 ; 122 <= sz < 123 return new int[122] else ; 123 <= sz < 124 return new int[123] endif endif else ; 124 <= sz < 128 if sz < 126 ; 124 <= sz < 126 if sz < 125 ; 124 <= sz < 125 return new int[124] else ; 125 <= sz < 126 return new int[125] endif else ; 126 <= sz < 128 if sz < 127 ; 126 <= sz < 127 return new int[126] else ; 127 <= sz < 128 return new int[127] endif endif endif endif endif endif elseif sz == 128 return new int[128] else debug.messagebox("Cannot create array of " + sz + " elements, Papyrus limit is 128") return none endif EndFunction Try and defend that. 773 lines of code to implement what should have been a language primitive. I'm sorry, I know a thing or two about being in crunch mode, but I can't defend this. Thanks, this has been very interesting to read for someone with nearly no programming knowledge like me. With such hassles this makes the work you and all the other skyrim script modders do even more admireable. Overall from the user perspective Skyrim still seems to be one of the best games for modding currently available, but leaves me dreaming how much more would be possible if a future Bethesda game would have a better programming language so that you modders would have less work and more possibilities. So mutliple thanks for not only making the mod, releasing updates and fixes so quickly and also doing all this additional work.
jonjonzz Posted July 7, 2014 Posted July 7, 2014 And let's not forget the fact that we are working with a compiled language here guys, if designing languages is easy then by all means make your own compiler to implement those keywords you are missing. A For loop, for instance, looks very much like a while loop in terms of the assembly or the bytecode in the compiled product. I have never been a fan of the "You can't criticize anything unless you make something better" type of argument, to be honest. Being easy and being time-consuming doesn't rule each other out, and I am pretty sure nobody of us wants to rewrite the Papyrus compiler from scratch just to prove that we could implement a "for" keyword. I think anyone who ever wrote a line of code knows that "for" and "while" are similar concepts. That doesn't mean that having it (and some other staples of modern languages that Papyrus is sorely missing) wouldn't be convenient. Exactly. There are certain constructs that any language nowadays should have. Papyrus doesn't have them. And let's not forget the fact that we are working with a compiled language here guys, if designing languages is easy then by all means make your own compiler to implement those keywords you are missing. A For loop, for instance, looks very much like a while loop in terms of the assembly or the bytecode in the compiled product. I have never been a fan of the "You can't criticize anything unless you make something better" type of argument, to be honest. Being easy and being time-consuming doesn't rule each other out, and I am pretty sure nobody of us wants to rewrite the Papyrus compiler from scratch just to prove that we could implement a "for" keyword. I think anyone who ever wrote a line of code knows that "for" and "while" are similar concepts. That doesn't mean that having it (and some other staples of modern languages that Papyrus is sorely missing) wouldn't be convenient. That isn't the point. The above posts are outright insulting to the game developers and while this community may be alright with mod developers alienating us from others I think it is a bad idea. Structs are not staples of modern languages (Java doesn't have structs and Java is used on almost as many devices as there are people in this world). For loops are not necessary and while I'm sure the compiler could have contained the necessary code to allow for loops let's not forget that this language is a language for a GAME not for mass production and each minute spent on the development of the compiler/language costs Bethesda a significant amount of money. You guys are acting like Papyrus should have all of the comforts of C, JAVA, or Python but realize those are GIGANTIC projects with entire corporations or open source communities helping with development. What I am saying to you is you are acting spoiled/entitled in every post. Get over it, be happy with what you are given and work with it. EDIT: BTW, to everyone complaining about the lack of structs. YOU HAVE THEM. Papyrus has no access restrictions so creating a new object with the necessary members is equivalent to creating a struct. Ok, structs. Java has them, it calls them classes. Note that in Java, I can call new ClassName() to instantiate more of them. In C, I can call malloc(sizeof(MyStruct)) to instantiate more. In C++, there's new MyClass(), in python I can call MyClass() to instantiate it. In Papyrus, I can go into the MCM and add a single instance. If I need 2 instances, I have to create 2 instances. If I want a 1000 instances, I have to create a 1000 instances. Don't tell me the things in papyrus are structs. They may appear to be so, but they lack a critical component of structs, namely instantiability. Secondly, I don't know if you've noticed, but all these mods/plugins/frameworks add up to a huge body of code with a huge number of developers. I don't get where you think this is not a GIGANTIC (your capitalization) project. There are entire open source communities working on making Skyrim even more awesome. Don't believe me? Go and look at the number of mods here and the number of mods on nexus. Skyrim is not tiny. I would not be surprised if Bethesda has more modders working on their game than they employ people in their company. Thirdly, for loops. I complained about them in this thread first, so I'll go in more depth. Any software developer will tell you that they keep a ton of things in their head while writing code. Just to name a few big areas: performance, error handling/recovery, fault tolerance, external interface, correctness. Papyrus adds a tremendous strain, by requiring us to set aside a large portion of our minds to deal with manually handling constructs that we are used to. These constructs don't just exist because we are lazy. They exist because they are useful and awesome; they enable us to dedicate less thinking to those parts and more thinking to the parts nobody has written yet. Let me put this in perspective: 10% of development time in this mod has been spent dealing with missed increments in while loops, because someone didn't write a for construct. Incidentally, it's also the cause of 50% of released bugs (but the sample size is a bit low). So if I am bitching about the lack of for loops, I'm entirely in my right, because the amount of time I spent dealing with their non-presence, is currently equal to the amount of time their compiler writer would have had to spend to implement the thing. And I'm not the only coder here. So this omission has cost more man hours here than it would have cost to implement. Thirdly, if you want to know how ridiculously basic the Papyrus language is, consider a function: int[] Function newArray(int sz) return new int[sz] EndFunction Try and defend that. 773 lines of code to implement what should have been a language primitive. I'm sorry, I know a thing or two about being in crunch mode, but I can't defend this. [edit] Just to clarify, I'm bitching about the language. Bethesda opted to design their own bytecode and language. They could have done different, for instance choose Lua for scripting, or if they wanted a bytecode, they could have looked at the LLVM bytecode. Both are high quality opensource products with a lot of smart people having tackled the teething problems already. Bethesda opted not to, for reasons I don't know and probably never will. However, now they have chosen that route, they must make it good. I'm sure in their next product they'll have a much improved Papyrus engine that will make the current one look ancient. But until that time, this is what we work with. And as it is very frustrating to lack basic constructs present in any language, well... I need to let that frustration out. If I don't, development on this mod will stop as each time I would touch the code, all those unreleased frustrations would come to the front of my mind. So please, allow me to vent every once in a while; it clears my mind and allows me to focus on what matters: the code I can write in this language. Java has classes (not structs, structs in C++ are the exact same thing as classes except that every member is default declared public). Again you were the one that said you did not have structs and yet you do essentially have structs, don't make up what a struct is based on your own predilections to tell me I am wrong. Instead say maybe that you want constructors, which would have been much more accurate. Why are you referring to Mod Configuration Manager? I think you are missing something. If you think papyrus can even hold a candle to JAVA, Python, or C in terms of amount of code you are beyond help. Take for instance the apache projects for JAVA. Comparing amateur open source modding communities to those types of projects is absurd. Stop. It is ridiculous to think that a language that was developed for the sole purpose of modding ONE game will have all of the features of a full language that has been developed for decades. Lua was probably skipped for the fact that it is interpreted, can't say why Bethesda chose not to use another compiled language but it is their prerogative not to. Sure for loops are nice, hell I use them probably more often than while loops in coding any language. But again, since you missed my point which I had spelled out to you. Development costs money. Since everything that can be done with a for loop can be done with a while loop it is much more cost efficient for the developer to not spend time on implementing a superfluous feature. That point is beyond argument. It may have cost you hours but you are not paid to work on this mod and you cost Bethesda nothing. Sure we would love to see dynamic arrays but looking at your code I can already tell you that you are sacrificing processing power for memory management and there are surely ways around that (each of your arrays eventually references a scalar property so why not constrain to that scalar?) Other modders have found ways around using dynamic arrays that did not require upwards of 50 flops just to make an array. Venting is one thing, insulting people is another. Look at it from the developer's perspective and tell me what you think they would feel reading your haughty posts. P.S. Stop trying to be patronizing. You are not the only programmer on this board.
Kimy Posted July 7, 2014 Posted July 7, 2014 Venting is one thing, insulting people is another. Look at it from the developer's perspective and tell me what you think they would feel reading your haughty posts. P.S. Stop trying to be patronizing. You are not the only programmer on this board. Let's get realistic for a moment: The last thing Bethesda had on their mind when designing their language was the question whether or not modders (particularly not those hanging out on an adult mod forum) were going to like it or not. That doesn't change the -fact- that compared to other contemporary languages, Papyrus is a fairly crude language and pointing out that -fact- doesn't constitute an insult at all, execpt you -want- to get insulted or consider truth to be insulting. The game designers probably gave their tool designers a list of things they need the scripting language to accomplish and they added functionality to Papyrus to get that exact job done, nothing more, nothing less. That's their prerogative. But pointing that out isn't a crime. I have to admit I find Papyrus to be fairly frustrating, too. For the past week I am trying to figure out why I can't overload a function in a certain mod with my own and get it to work. Papyrus's understanding of object-oriented programming and my own are probably not quite compatible as it seems. That's not an insult, just me thinking back at basically every other language I ever used and wishing Papyrus would be as good as any of them. Or just wishing they'd just have picked up Lua, which is proven to handle a lot more complex things than Skyrim. Feel free to hate me for saying that aloud. *shrug*
jonjonzz Posted July 7, 2014 Posted July 7, 2014 Let me quote the public api:OnPlayerBowShot(Weapon akWeapon, Ammo akAmmo, Float afPower, Bool abSunGazing)To me, this design sounds more like "aawww, fuck it. just add the parameter and be done with it." ... Not the kind of designers you want working on your modding framework. Ew, bah, gross! I'm gonna need a shower. They forgot Bool GrowlingStomach, Bool IsIntoxicatedAndCantShootStraight and Bool IsGettingTickledFromBehind, though Yes, all not insulting at all. Even though that bool is actually used. You are correct, you are only spewing facts. ./sarcasm
circ Posted July 7, 2014 Posted July 7, 2014 I'm sure such harsh words are driving developers into rampant alcoholism and contemplation of suicide. Can we maybe get back to the mod at hand?
Aelie Posted July 7, 2014 Posted July 7, 2014 to me, if they werent going to make a DECENT language, they could have just picked an existing one. lua? it might have been easier to rely on an already developed scripting language
irquih Posted July 7, 2014 Author Posted July 7, 2014 I'm sure such harsh words are driving developers into rampant alcoholism and contemplation of suicide. Can we maybe get back to the mod at hand? You're right, let's get back to the fun part.
xaz Posted July 7, 2014 Posted July 7, 2014 And let's not forget the fact that we are working with a compiled language here guys, if designing languages is easy then by all means make your own compiler to implement those keywords you are missing. A For loop, for instance, looks very much like a while loop in terms of the assembly or the bytecode in the compiled product. I have never been a fan of the "You can't criticize anything unless you make something better" type of argument, to be honest. Being easy and being time-consuming doesn't rule each other out, and I am pretty sure nobody of us wants to rewrite the Papyrus compiler from scratch just to prove that we could implement a "for" keyword. I think anyone who ever wrote a line of code knows that "for" and "while" are similar concepts. That doesn't mean that having it (and some other staples of modern languages that Papyrus is sorely missing) wouldn't be convenient. That isn't the point. The above posts are outright insulting to the game developers and while this community may be alright with mod developers alienating us from others I think it is a bad idea. Structs are not staples of modern languages (Java doesn't have structs and Java is used on almost as many devices as there are people in this world). For loops are not necessary and while I'm sure the compiler could have contained the necessary code to allow for loops let's not forget that this language is a language for a GAME not for mass production and each minute spent on the development of the compiler/language costs Bethesda a significant amount of money. You guys are acting like Papyrus should have all of the comforts of C, JAVA, or Python but realize those are GIGANTIC projects with entire corporations or open source communities helping with development. What I am saying to you is you are acting spoiled/entitled in every post. Get over it, be happy with what you are given and work with it. EDIT: BTW, to everyone complaining about the lack of structs. YOU HAVE THEM. Papyrus has no access restrictions so creating a new object with the necessary members is equivalent to creating a struct. I think you seem to confuse the work behind implementing a compiler with the work of designing the language. Those two are necessarily intertwined, but when for-loops are abscent, you have to wonder what the developers were thinking; why was this decision made? As you pointed out, it would've been easy to add. Same thing with dynamic array sizes. Compare some fictional code fragments: ForEach (Actor a in actorCollection) DoSomething(a) EndFor ... compared with how it is today ... Int i = 0 While i < actorCollection.Length Actor a = actorCollection.GetAt(i) DoSomething(a) i++ EndWhile How many times do you think similar code comes up? Saying that Papyrus does little to help Skyrim development is an understatement. I'm not sure how much Skyrim modding you've done, but most here who do modding that I've spoken to seem to arrive at the same conclusion: It feels like the developers of Papyrus (and CK) were not involved in making content for the game. This makes perfect sense to me, because they were probably engine developers. Finally, when I criticize Papyrus (can't speak for anyone else), that should not be taken as a personal insult to the game developers. In professional software development, it is normal to receive feedback on your code, design and so on. If anyone takes a suggestion that "for-loops would be good to have" as a personal insult, then that's a big problem in an environment where it's necessary to work with other people. I can't speak for anyone but me, but if I was designing Papyrus and someone told me "hey, what we really need is a foreach keyword", that would be really good feedback on my work. Maybe, I'd tell them (for whatever reason) it couldn't be done, but I for sure would not be insulted.
xaz Posted July 7, 2014 Posted July 7, 2014 Let me quote the public api: OnPlayerBowShot(Weapon akWeapon, Ammo akAmmo, Float afPower, Bool abSunGazing) To me, this design sounds more like "aawww, fuck it. just add the parameter and be done with it." ... Not the kind of designers you want working on your modding framework. Ew, bah, gross! I'm gonna need a shower. They forgot Bool GrowlingStomach, Bool IsIntoxicatedAndCantShootStraight and Bool IsGettingTickledFromBehind, though Yes, all not insulting at all. Even though that bool is actually used. You are correct, you are only spewing facts. ./sarcasm That is not an insult. It is horrible design, and anyone who writes software (professionally) should agree with me. I'm not saying it wasn't a good choice at the time. I wasn't there, I don't know what time constraints and/or alternatives they considered. Maybe they just needed to add a quick function, and creating an api for sun position, aiming direction and so on when firing a bow was overkill. I think I'd agree.... but it doesn't make it good design.
Heromaster Posted July 7, 2014 Posted July 7, 2014 I agree with you, Papyrus is a terrible language by design. It's like an attempt to mix OOP with batch scripting. The power of Papyrus is great and offers way more than what I've seen from the language they used previously. But still, it is lacking alot of modern languages. For a language which is capable of multi-threading it seriously lacks an implementation of a Thread Model. There is no real distinction between classes and objects, their vision of arrays and properties is a shame. Last time I had to work with fixed sized arrays was on my Amiga 500 (And even there it was easy to increase the size). For a 21th century language it feels like we are ported back to the Stone Age.
irquih Posted July 7, 2014 Author Posted July 7, 2014 Anyway... I fixed the race detection (that means Sanguine can talk with you, if he wants to). I also implemented a debug page for the Exclusion Scanner, so that people can test which tags prevent an NPC from talking with them. This is mainly intended for mod authors, as a debugging tool. Strings are displayed, sorted alphabetically; the system can handle (i.e. display) roughly 231 - 27 strings, that should be more than sufficient to cover anything, I guess.
Kimy Posted July 7, 2014 Posted July 7, 2014 While testing v9.1 I had an odd experience. I encountered a bounty hunter who beat up poor me, making Submit trigger. He had his fun with me as expected, tied me up (I was wearing pretty much every possible restraint save for an armbinder at this time, -including- a gag)...and then your "What have we here?" dialog tree triggered without me trying to interact with the guy at all. I tested it a bit more and it seems I am able to trigger your dialog on pretty much any hostile pacified by Submit. Which...I don't think should happen, so maybe you could try and add a check for hostiles? Another thing that occurred to me was that many DD mods lock away the MCM options when you're wearing bondage gear, which I think adds to the "NO, don't even THINK about cheating your way out of this by making the options easier!!!" feeling. Could that be something you could maybe add to your mod, too? And finally - any plans to add boots to your mod? Looking at it, it seems that boots are pretty much the only type of restraints your mod can't handle so far.
Aelie Posted July 7, 2014 Posted July 7, 2014 Prefer the developer discussion moved elsewhere, for instance here. Anyway... I fixed the race detection (that means Sanguine can talk with you, if he wants to). I also implemented a debug page for the Exclusion Scanner, so that people can test which tags prevent an NPC from talking with them. This is mainly intended for mod authors, as a debugging tool. Strings are displayed, sorted alphabetically; the system can handle (i.e. display) roughly 231 - 27 strings, that should be more than sufficient to cover anything, I guess. (I dont know if its possible, but a moderator can split all the irrelevant posts out into a seperate thread?)
irquih Posted July 7, 2014 Author Posted July 7, 2014 While testing v9.1 I had an odd experience. I encountered a bounty hunter who beat up poor me, making Submit trigger. He had his fun with me as expected, tied me up (I was wearing pretty much every possible restraint save for an armbinder at this time, -including- a gag)...and then your "What have we here?" dialog tree triggered without me trying to interact with the guy at all. I tested it a bit more and it seems I am able to trigger your dialog on pretty much any hostile pacified by Submit. Which...I don't think should happen, so maybe you could try and add a check for hostiles? Hmm, that's going to be tricky. Since they aren't hostiles anymore once Submit has their way with them. This will probably mean I have to add submit, defeat and helpless to the support list. I'll look into it, but this might be non-trivial. So, he started chatting on his own with you? Hmm, that is odd. I don't have submit installed right now, so this is from memory: would an enemy normally say something at that point? In that case, it might be that my dialog overrides a dialog in a force greet package, perhaps... I'll try reproduce it tomorrow. Another thing that occurred to me was that many DD mods lock away the MCM options when you're wearing bondage gear, which I think adds to the "NO, don't even THINK about cheating your way out of this by making the options easier!!!" feeling. Could that be something you could maybe add to your mod, too? I totally could. And finally - any plans to add boots to your mod? Looking at it, it seems that boots are pretty much the only type of restraints your mod can't handle so far. Plans are there. It's just that while I was adding items, I got afraid of the amount of dialog to write and chickened out of the boots. As far as I know, the relevant keyword should be in DD-Integration. Prefer the developer discussion moved elsewhere, for instance here. (I dont know if its possible, but a moderator can split all the irrelevant posts out into a seperate thread?) That may work. Although I'm kinda sad that I won't be able to complain about papyrus in my mod thread anymore. It was such a nice way to let of steam.
Aelie Posted July 7, 2014 Posted July 7, 2014 you still can, just dont be surprised when it turns into a thread about the merits and demerits of papyrus
xboronx Posted July 8, 2014 Posted July 8, 2014 While testing v9.1 I had an odd experience. I encountered a bounty hunter who beat up poor me, making Submit trigger. He had his fun with me as expected, tied me up (I was wearing pretty much every possible restraint save for an armbinder at this time, -including- a gag)...and then your "What have we here?" dialog tree triggered without me trying to interact with the guy at all. I tested it a bit more and it seems I am able to trigger your dialog on pretty much any hostile pacified by Submit. Which...I don't think should happen, so maybe you could try and add a check for hostiles? Hmm, that's going to be tricky. Since they aren't hostiles anymore once Submit has their way with them. This will probably mean I have to add submit, defeat and helpless to the support list. I'll look into it, but this might be non-trivial. So, he started chatting on his own with you? Hmm, that is odd. I don't have submit installed right now, so this is from memory: would an enemy normally say something at that point? In that case, it might be that my dialog overrides a dialog in a force greet package, perhaps... I'll try reproduce it tomorrow. Just curious, was it a normal bounty hunter or one generated via PrisonOverhaul? Furthermore lets not forget SD+ among the mods which trigger pacified enemies when the player surrenders. And finally the Daymoyl addon might also be worth a look: http://www.nexusmods.com/skyrim/mods/54867/? So far i haven't been in one of those enslavement scenarios, but would be bad if the vampires or falmer which captured you could be persuaded to remove your Devious Devices.
irquih Posted July 8, 2014 Author Posted July 8, 2014 While testing v9.1 I had an odd experience. I encountered a bounty hunter who beat up poor me, making Submit trigger. He had his fun with me as expected, tied me up (I was wearing pretty much every possible restraint save for an armbinder at this time, -including- a gag)...and then your "What have we here?" dialog tree triggered without me trying to interact with the guy at all. I tested it a bit more and it seems I am able to trigger your dialog on pretty much any hostile pacified by Submit. Which...I don't think should happen, so maybe you could try and add a check for hostiles? Hmm, that's going to be tricky. Since they aren't hostiles anymore once Submit has their way with them. This will probably mean I have to add submit, defeat and helpless to the support list. I'll look into it, but this might be non-trivial. So, he started chatting on his own with you? Hmm, that is odd. I don't have submit installed right now, so this is from memory: would an enemy normally say something at that point? In that case, it might be that my dialog overrides a dialog in a force greet package, perhaps... I'll try reproduce it tomorrow. Just curious, was it a normal bounty hunter or one generated via PrisonOverhaul? Furthermore lets not forget SD+ among the mods which trigger pacified enemies when the player surrenders. And finally the Daymoyl addon might also be worth a look: http://www.nexusmods.com/skyrim/mods/54867/? So far i haven't been in one of those enslavement scenarios, but would be bad if the vampires or falmer which captured you could be persuaded to remove your Devious Devices. Currently, you can ask vampires. They fall in the NPC category. I assume if you join the vampires in the Dawnguard expansion, you kinda expect them to help you out. Or maybe they aren't that nice... I wouldn't know, haven't gotten that far yet. People who are interested in being gagged, also check out this brand new mod: zenet_GagQuest. A very different approach to mine, worth checking out. Unfortunately, we're incompatible, so you can't use both at the same time.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now